|  | // META: title=IndexedDB: recursive value | 
|  | // META: global=window,worker | 
|  | // META: script=resources/support.js | 
|  |  | 
|  | 'use strict'; | 
|  |  | 
|  | function recursive_value(desc, value) { | 
|  | let db; | 
|  | const t = async_test('Recursive value - ' + desc); | 
|  |  | 
|  | createdb(t).onupgradeneeded = t.step_func((e) => { | 
|  | db = e.target.result; | 
|  | db.createObjectStore('store').add(value, 1); | 
|  |  | 
|  | e.target.onsuccess = t.step_func((e) => { | 
|  | db.transaction('store', 'readonly') | 
|  | .objectStore('store') | 
|  | .get(1) | 
|  | .onsuccess = t.step_func((e) => { | 
|  | try { | 
|  | JSON.stringify(value); | 
|  | assert_unreached( | 
|  | 'The test case is incorrect. It must provide a recursive value that JSON cannot stringify.'); | 
|  | } catch (e) { | 
|  | if (e.name == 'TypeError') { | 
|  | try { | 
|  | JSON.stringify(e.target.result); | 
|  | assert_unreached( | 
|  | 'Expected a non-JSON-serializable value back, didn\'t get that.'); | 
|  | } catch (e) { | 
|  | t.done(); | 
|  | return; | 
|  | } | 
|  | } else | 
|  | throw e; | 
|  | } | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | } | 
|  |  | 
|  | const recursive = []; | 
|  | recursive.push(recursive); | 
|  | recursive_value('array directly contains self', recursive); | 
|  |  | 
|  | const recursive2 = []; | 
|  | recursive2.push([recursive2]); | 
|  | recursive_value('array indirectly contains self', recursive2); | 
|  |  | 
|  | const recursive3 = [recursive]; | 
|  | recursive_value('array member contains self', recursive3); |