| Index: third_party/WebKit/LayoutTests/nfc/push.html | 
| diff --git a/third_party/WebKit/LayoutTests/nfc/push.html b/third_party/WebKit/LayoutTests/nfc/push.html | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..eb0ab795d5a3c38b3b6fbec06651abed4044441b | 
| --- /dev/null | 
| +++ b/third_party/WebKit/LayoutTests/nfc/push.html | 
| @@ -0,0 +1,157 @@ | 
| +<!DOCTYPE html> | 
| +<script src="../resources/testharness.js"></script> | 
| +<script src="../resources/testharness-helpers.js"></script> | 
| +<script src="../resources/testharnessreport.js"></script> | 
| +<script src="../resources/mojo-helpers.js"></script> | 
| +<script src="resources/nfc-helpers.js"></script> | 
| +<script> | 
| + | 
| +'use strict'; | 
| + | 
| +const invalid_messages = | 
| +    [ | 
| +      // NFCMessage.data: 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.mediaType for 'text' record must be text/* . | 
| +      createMessage([createRecord('text', 'application/json', | 
| +          test_number_data)]), | 
| + | 
| +      // 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)]), | 
| + | 
| +      // NFCRecord.mediaType for 'json' record must be 'application/json'. | 
| +      createMessage([createRecord('json', 'image/png', test_json_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)]) | 
| +    ]; | 
| + | 
| +nfc_test(nfc => { | 
| +  return assert_promise_rejects( | 
| +      navigator.nfc.push(undefined), | 
| +      'TypeMismatchError'); | 
| +}, 'Reject promise with TypeMismatchError if invalid type is provided.'); | 
| + | 
| +invalid_messages.forEach(message => { | 
| +  nfc_test(nfc => { | 
| +    return assert_promise_rejects( | 
| +      navigator.nfc.push(message), | 
| +      'SyntaxError'); | 
| +  }, 'Reject promise with SyntaxError if NFCMessage is invalid.'); | 
| +}); | 
| + | 
| +nfc_test(nfc => { | 
| +  nfc.mockNFC.setHWStatus(NFCHWStatus.DISABLED); | 
| +  return assert_promise_rejects( | 
| +      navigator.nfc.push(test_text_data), | 
| +      'NotSupportedError'); | 
| +}, 'nfc.push should fail when NFC HW is disabled.') | 
| + | 
| +nfc_test(nfc => { | 
| +  nfc.mockNFC.setHWStatus(NFCHWStatus.NOT_SUPPORTED); | 
| +  return assert_promise_rejects( | 
| +      navigator.nfc.push(test_text_data), | 
| +      'NotSupportedError'); | 
| +}, 'nfc.push should fail when NFC HW is not supported.') | 
| + | 
| +nfc_test(nfc => { | 
| +  return navigator.nfc.push(test_text_data, { timeout: 1 }); | 
| +}, 'nfc.push should succeed when NFC HW is enabled') | 
| + | 
| +nfc_test(nfc => { | 
| +  nfc.mockNFC.setPendingPushCompleted(false); | 
| +  return assert_promise_rejects( | 
| +      navigator.nfc.push(test_text_data, { timeout: 1 }), | 
| +      'TimeoutError'); | 
| +}, 'nfc.push should fail with TimeoutError when push operation' + | 
| +    ' is not completed before specified timeout value.') | 
| + | 
| +nfc_test(nfc => { | 
| +  let message = createMessage([createTextRecord(test_text_data), | 
| +                               createJsonRecord(test_json_data), | 
| +                               createOpaqueRecord(test_buffer_data), | 
| +                               createTextRecord(test_number_data), | 
| +                               createUrlRecord(test_url_data)], | 
| +                               test_message_origin); | 
| +  return navigator.nfc.push(message).then(() => { | 
| +    nfc.assertNFCMessagesEqual(message, nfc.mockNFC.pushedMessage()); | 
| +  }); | 
| +}, 'nfc.push NFCMessage containing text, json, opaque and url records with default ' | 
| +    + 'NFCPushOptions.') | 
| + | 
| +nfc_test(nfc => { | 
| +  return navigator.nfc.push(test_text_data).then(() => { | 
| +    nfc.assertNFCMessagesEqual(test_text_data, nfc.mockNFC.pushedMessage()); | 
| +  }); | 
| +}, 'nfc.push String with default NFCPushOptions.') | 
| + | 
| +nfc_test(nfc => { | 
| +  return navigator.nfc.push(test_buffer_data).then(() => { | 
| +    nfc.assertNFCMessagesEqual(test_buffer_data, nfc.mockNFC.pushedMessage()); | 
| +  }); | 
| +}, 'nfc.push ArrayBuffer with default NFCPushOptions.') | 
| + | 
| +nfc_test(nfc => { | 
| +  return navigator.nfc.push(test_text_data).then(() => { | 
| +    nfc.assertNFCPushOptionsEqual(createNFCPushOptions('any', Infinity, true), nfc.mockNFC.pushOptions()); | 
| +  }); | 
| +}, 'Check that default NFCPushOptions values are correctly set.') | 
| + | 
| +nfc_test(nfc => { | 
| +  let nfcPushOptions = createNFCPushOptions('tag', 1, false); | 
| +  return navigator.nfc.push(test_text_data, nfcPushOptions).then(() => { | 
| +    nfc.assertNFCPushOptionsEqual(nfcPushOptions, nfc.mockNFC.pushOptions()); | 
| +  }); | 
| +}, 'Check that provided NFCPushOptions values are correctly converted.') | 
| + | 
| +nfc_test(nfc => { | 
| +  return navigator.nfc.push(test_buffer_data).then(() => { | 
| +    nfc.assertNFCMessagesEqual(test_buffer_data, nfc.mockNFC.pushedMessage()); | 
| +  }); | 
| +}, 'Push ArrayBuffer with default NFCPushOptions.') | 
| + | 
| +nfc_test(nfc => { | 
| +  return navigator.nfc.push(test_text_data) | 
| +      .then(() => { navigator.nfc.cancelPush }); | 
| +}, 'nfc.cancelPush should succeed if there is pending push operation.') | 
| + | 
| +nfc_test(nfc => { | 
| +  nfc.mockNFC.setPendingPushCompleted(false); | 
| +  let promise = navigator.nfc.push(test_text_data, { timeout: 100 }); | 
| +  navigator.nfc.cancelPush(); | 
| +  return assert_promise_rejects( | 
| +      promise, | 
| +      'AbortError'); | 
| +}, 'nfc.cancelPush should reject pending promise with AbortError.') | 
| + | 
| +</script> | 
|  |