| OLD | NEW | 
| (Empty) |  | 
 |    1 <!DOCTYPE html> | 
 |    2 <!--  Submitted from TestTWF Paris  --> | 
 |    3 <meta charset=utf-8"> | 
 |    4 <title>Invalid key</title> | 
 |    5 <link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#
     key-construct"> | 
 |    6 <link rel=assert title="A value is said to be a valid key if it is one of the fo
     llowing types: Array JavaScript objects [ECMA-262], DOMString [WEBIDL], Date [EC
     MA-262] or float [WEBIDL]. However Arrays are only valid keys if every item in t
     he array is defined and is a valid key (i.e. sparse arrays can not be valid keys
     ) and if the Array doesn't directly or indirectly contain itself. Any non-numeri
     c properties are ignored, and thus does not affect whether the Array is a valid 
     key. Additionally, if the value is of type float, it is only a valid key if it i
     s not NaN, and if the value is of type Date it is only a valid key if its [[Prim
     itiveValue]] internal property, as defined by [ECMA-262], is not NaN. Conforming
      user agents must support all valid keys as keys."> | 
 |    7 <!--  original author  --> | 
 |    8 <link rel=author href="mailto:odinho@opera.com" title="Odin Hørthe Omdal"> | 
 |    9 <!--  some additions by Baptiste Fontaine (batifon@yahoo.fr)  --> | 
 |   10 <script src=../../../resources/testharness.js></script> | 
 |   11 <script src=../../../resources/testharnessreport.js></script> | 
 |   12 <script src=support.js></script> | 
 |   13  | 
 |   14 <script> | 
 |   15     var db        = createdb_for_multiple_tests(), | 
 |   16         // cache for ObjectStores | 
 |   17         objStore  = null, | 
 |   18         objStore2 = null; | 
 |   19  | 
 |   20     function invalid_key(desc, key) { | 
 |   21         var t = async_test(document.title + " - " + desc); | 
 |   22  | 
 |   23         // set the current test, and run it | 
 |   24         db.setTest(t).onupgradeneeded = function(e) { | 
 |   25             objStore = objStore || e.target.result.createObjectStore("store"); | 
 |   26             assert_throws('DataError', function() { | 
 |   27                 objStore.add("value", key); | 
 |   28             }); | 
 |   29  | 
 |   30             objStore2 = objStore2 || e.target.result.createObjectStore("store2",
      { keyPath: ["x", "keypath"] }); | 
 |   31             assert_throws('DataError', function() { | 
 |   32                 objStore2.add({ x: "value", keypath: key }); | 
 |   33             }); | 
 |   34  | 
 |   35             this.done(); | 
 |   36         }; | 
 |   37     } | 
 |   38  | 
 |   39     var fake_array = { | 
 |   40         length      : 0, | 
 |   41         constructor : Array | 
 |   42     }; | 
 |   43  | 
 |   44     var ArrayClone = function(){}; | 
 |   45     ArrayClone.prototype = Array; | 
 |   46     var ArrayClone_instance = new ArrayClone(); | 
 |   47  | 
 |   48     // booleans | 
 |   49     invalid_key( 'true'  , true ); | 
 |   50     invalid_key( 'false' , false ); | 
 |   51  | 
 |   52     // null/NaN/undefined | 
 |   53     invalid_key( 'null'      , null ); | 
 |   54     invalid_key( 'NaN'       , NaN ); | 
 |   55     invalid_key( 'undefined' , undefined ); | 
 |   56     invalid_key( 'undefined2'); | 
 |   57  | 
 |   58     // functions | 
 |   59     invalid_key( 'function() {}', function(){} ); | 
 |   60  | 
 |   61     // objects | 
 |   62     invalid_key( '{}'                           , {} ); | 
 |   63     invalid_key( '{ obj: 1 }'                   , { obj: 1 }); | 
 |   64     invalid_key( 'Math'                         , Math ); | 
 |   65     invalid_key( 'window'                       , window ); | 
 |   66     invalid_key( '{length:0,constructor:Array}' , fake_array ); | 
 |   67     invalid_key( 'Array clone’s instance'       , ArrayClone_instance ); | 
 |   68     invalid_key( 'Array (object)'               , Array ); | 
 |   69     invalid_key( 'String (object)'              , String ); | 
 |   70     invalid_key( 'new String()'                 , new String() ); | 
 |   71     invalid_key( 'new Number()'                 , new Number() ); | 
 |   72     invalid_key( 'new Boolean()'                , new Boolean() ); | 
 |   73  | 
 |   74     // arrays | 
 |   75     invalid_key( '[{}]'                     , [{}] ); | 
 |   76     invalid_key( '[[], [], [], [[ Date ]]]' , [ [], [], [], [[ Date ]] ] ); | 
 |   77     invalid_key( '[undefined]'              , [undefined] ); | 
 |   78     invalid_key( '[,1]'                     , [,1] ); | 
 |   79  | 
 |   80     invalid_key( 'document.getElements' | 
 |   81                 +'ByTagName("script")'      , document.getElementsByTagName("scr
     ipt") ); | 
 |   82  | 
 |   83     //  dates | 
 |   84     invalid_key( 'new Date(NaN)'      , new Date(NaN) ); | 
 |   85     invalid_key( 'new Date(Infinity)' , new Date(Infinity) ); | 
 |   86  | 
 |   87     // regexes | 
 |   88     invalid_key( '/foo/'        , /foo/ ); | 
 |   89     invalid_key( 'new RegExp()' , new RegExp() ); | 
 |   90  | 
 |   91     var sparse = []; | 
 |   92     sparse[10] = "hei"; | 
 |   93     invalid_key('sparse array', sparse); | 
 |   94  | 
 |   95     var sparse2 = []; | 
 |   96     sparse2[0]  = 1; | 
 |   97     sparse2[""] = 2; | 
 |   98     sparse2[2]  = 3; | 
 |   99     invalid_key('sparse array 2', sparse2); | 
 |  100  | 
 |  101     invalid_key('[[1], [3], [7], [[ sparse array ]]]', [ [1], [3], [7], [[ spars
     e2 ]] ]); | 
 |  102  | 
 |  103     // sparse3 | 
 |  104     invalid_key( '[1,2,3,,]', [1,2,3,,] ); | 
 |  105  | 
 |  106     var recursive = []; | 
 |  107     recursive.push(recursive); | 
 |  108     invalid_key('array directly contains self', recursive); | 
 |  109  | 
 |  110     var recursive2 = []; | 
 |  111     recursive2.push([recursive2]); | 
 |  112     invalid_key('array indirectly contains self', recursive2); | 
 |  113  | 
 |  114     var recursive3 = [recursive]; | 
 |  115     invalid_key('array member contains self', recursive3); | 
 |  116  | 
 |  117 </script> | 
 |  118  | 
 |  119 <div id=log></div> | 
| OLD | NEW |