| 'use strict'; | 
 |  | 
 | test(() => { | 
 |   let recordInit = {recordType: 'w3.org:ExternalRecord'}; | 
 |   const messageInit = {records: [recordInit]}; | 
 |   recordInit.data = messageInit; | 
 |  | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFMessage(messageInit); | 
 |   }, 'Creating a recursive NDEFMessage throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFRecord(recordInit); | 
 |   }, 'Creating a recursive NDEFRecord throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFReadingEvent('message', {message: messageInit}); | 
 |   }, 'Creating a recursive NDEFReadingEvent throws a TypeError'); | 
 | }, 'NDEFRecord and NDEFMessage cycle in external records'); | 
 |  | 
 | test(() => { | 
 |   let recordInit = {recordType: ':local'}; | 
 |   const messageInit = {records: [recordInit]}; | 
 |   recordInit.data = messageInit; | 
 |  | 
 |   const externalRecordMessageInit = { | 
 |     records: [{recordType: 'w3.org:ExternalRecord', data: messageInit}] | 
 |   }; | 
 |  | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFMessage(externalRecordMessageInit); | 
 |   }, 'Creating a recursive NDEFMessage throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFRecord(externalRecordMessageInit.records[0]); | 
 |   }, 'Creating a recursive NDEFRecord throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFReadingEvent('message', {message: externalRecordMessageInit}); | 
 |   }, 'Creating a recursive NDEFReadingEvent throws a TypeError'); | 
 | }, 'NDEFRecord and NDEFMessage cycle in local records'); | 
 |  | 
 | test(() => { | 
 |   let recordInit = {recordType: 'smart-poster'}; | 
 |   const messageInit = { | 
 |     records: [ | 
 |       // Smart poster records require an URL record. Add it here so we can be | 
 |       // sure a TypeError is being thrown because of the recursion limit, not | 
 |       // the lack of a mandatory record. | 
 |       {recordType: 'url', data: 'https://w3.org'}, recordInit | 
 |     ] | 
 |   }; | 
 |   recordInit.data = messageInit; | 
 |  | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFMessage(messageInit); | 
 |   }, 'Creating a recursive NDEFMessage throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFRecord(recordInit); | 
 |   }, 'Creating a recursive NDEFRecord throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFReadingEvent('message', {message: messageInit}); | 
 |   }, 'Creating a recursive NDEFReadingEvent throws a TypeError'); | 
 | }, 'NDEFRecord and NDEFMessage cycle in smart poster records'); | 
 |  | 
 | function makeSmartPosterMessageInit(innerMessageInit) { | 
 |   const innerRecords = innerMessageInit.records; | 
 |   return { | 
 |     records: [{ | 
 |       recordType: 'smart-poster', | 
 |       data: { | 
 |         records: | 
 |             [{recordType: 'url', data: 'https://w3.org'}].concat(innerRecords) | 
 |       } | 
 |     }] | 
 |   }; | 
 | } | 
 |  | 
 | // Creates an NDEFMessageInit with nested records except for the innermost | 
 | // one, which is an empty record. | 
 | function makeRecursiveMessageInit(innerRecordType, maxDepth) { | 
 |   function innerHelper(value) { | 
 |     if (++value > maxDepth) { | 
 |       return {records: [{recordType: 'empty'}]}; | 
 |     } | 
 |  | 
 |     return {records: [{recordType: innerRecordType, data: innerHelper(value)}]}; | 
 |   } | 
 |  | 
 |   return innerHelper(0); | 
 | } | 
 |  | 
 | // Maximum number of chained NDEFMessages according to the spec. | 
 | const MAX_NESTING_LEVEL = 32; | 
 |  | 
 | test(() => { | 
 |   // makeRecursiveMessageInit(..., N) will cause N NDEFMessages to be created | 
 |   // when it is parsed. The calls are passed to an outer NDEFMessage | 
 |   // constructor, so we end up with N+1 NDEFMessage objects. The spec allows | 
 |   // up to 32 NDEFMessages in the same chain, and we have 33 here. | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFMessage( | 
 |         makeRecursiveMessageInit('w3.org:ExternalRecord', MAX_NESTING_LEVEL)); | 
 |   }, 'Creating a recursive NDEFMessage throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     new NDEFReadingEvent('message', { | 
 |       message: | 
 |           makeRecursiveMessageInit('w3.org:ExternalRecord', MAX_NESTING_LEVEL) | 
 |     }); | 
 |   }, 'Creating a recursive NDEFReadingEvent throws a TypeError'); | 
 |  | 
 |   // Here we call makeRecursiveMessageInit() with a smaller number than above | 
 |   // because there is a smart poster wrapping everything that also creates an | 
 |   // NDEFMessage. | 
 |   assert_throws_js(TypeError, () => { | 
 |     const innerMessageInit = makeRecursiveMessageInit( | 
 |         'w3.org:ExternalRecord', MAX_NESTING_LEVEL - 1); | 
 |     new NDEFMessage(makeSmartPosterMessageInit(innerMessageInit)); | 
 |   }, 'Creating a recursive NDEFMessage throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     const innerMessageInit = | 
 |         makeRecursiveMessageInit(':local', MAX_NESTING_LEVEL - 1); | 
 |     new NDEFMessage(makeSmartPosterMessageInit(innerMessageInit)); | 
 |   }, 'Creating a recursive NDEFMessage throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     const innerMessageInit = makeRecursiveMessageInit( | 
 |         'w3.org:ExternalRecord', MAX_NESTING_LEVEL - 1); | 
 |     new NDEFReadingEvent( | 
 |         'message', {message: makeSmartPosterMessageInit(innerMessageInit)}); | 
 |   }, 'Creating a recursive NDEFMessage throws a TypeError'); | 
 |   assert_throws_js(TypeError, () => { | 
 |     const innerMessageInit = | 
 |         makeRecursiveMessageInit(':local', MAX_NESTING_LEVEL - 1); | 
 |     new NDEFReadingEvent( | 
 |         'message', {message: makeSmartPosterMessageInit(innerMessageInit)}); | 
 |   }, 'Creating a recursive NDEFMessage throws a TypeError'); | 
 | }, 'Create too many nested NDEFMessages'); | 
 |  | 
 | // See above for explanations about the counts passed to | 
 | // makeRecursiveMessageInit(). | 
 | test(() => { | 
 |   new NDEFMessage( | 
 |       makeRecursiveMessageInit('w3.org:ExternalRecord', MAX_NESTING_LEVEL - 1)); | 
 |   new NDEFReadingEvent('message', { | 
 |     message: | 
 |         makeRecursiveMessageInit('w3.org:ExternalRecord', MAX_NESTING_LEVEL - 1) | 
 |   }); | 
 |  | 
 |   let innerMessageInit; | 
 |  | 
 |   innerMessageInit = | 
 |       makeRecursiveMessageInit('w3.org:ExternalRecord', MAX_NESTING_LEVEL - 2); | 
 |   new NDEFMessage(makeSmartPosterMessageInit(innerMessageInit)); | 
 |   new NDEFReadingEvent( | 
 |       'message', {message: makeSmartPosterMessageInit(innerMessageInit)}); | 
 |   innerMessageInit = makeRecursiveMessageInit(':local', MAX_NESTING_LEVEL - 2); | 
 |   new NDEFMessage(makeSmartPosterMessageInit(innerMessageInit)); | 
 |   new NDEFReadingEvent( | 
 |       'message', {message: makeSmartPosterMessageInit(innerMessageInit)}); | 
 | }, 'Nest maximum number of NDEFMessages') |