| // 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); |