Home | History | Annotate | Download | only in indexeddb
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 function test()
      6 {
      7   indexedDBTest(prepareDatabase, testUnderLimit);
      8 }
      9 
     10 function prepareDatabase()
     11 {
     12   db = event.target.result;
     13   debug('Creating object store');
     14   var store = db.createObjectStore('store');
     15   store.put("FIRST!!!111!", -Infinity);
     16 }
     17 
     18 function repeat(string, len)
     19 {
     20   return Array(len + 1).join(string);
     21 }
     22 
     23 var SEED = "\u0100"; // Encodes to 2 byte in UTF-8 and UTF-16
     24 var BYTES_PER_CHAR = 2;
     25 var CHARS_PER_MB = 1024 * 1024 / BYTES_PER_CHAR;
     26 var SLOP = 1024;
     27 var LIMIT_MB = 64;
     28 var key = 0;
     29 var value;
     30 
     31 function testUnderLimit()
     32 {
     33   debug("");
     34   debug('Creating test value under limit');
     35   var underLimit;
     36   setTimeout(
     37     function () {
     38       value = repeat(SEED, LIMIT_MB * CHARS_PER_MB - SLOP); // Just under limit
     39       underLimit = value;
     40       setTimeout(doStore, 0);
     41     }, 0);
     42 
     43   function doStore() {
     44     var transaction = db.transaction("store", 'readwrite');
     45     var store = transaction.objectStore("store");
     46     var request;
     47 
     48     debug("store.add underLimit");
     49     request = store.add(underLimit, key++);
     50     request.onerror = unexpectedErrorCallback;
     51     request.onsuccess = function () {
     52       debug("store.add succeeded");
     53       storeAddSucceeded = true;
     54 
     55       debug("store.put underLimit");
     56       request = store.put(underLimit, key++);
     57       request.onerror = unexpectedErrorCallback;
     58       request.onsuccess = function () {
     59         debug("store.put succeeded");
     60         storePutSucceeded = true;
     61 
     62         debug("cursor.update underLimit");
     63         request = store.openCursor();
     64         request.onerror = unexpectedErrorCallback;
     65         request.onsuccess = function () {
     66           var cursor = request.result;
     67           request = cursor.update(underLimit);
     68           request.onerror = unexpectedErrorCallback;
     69           request.onsuccess = function () {
     70             debug("cursor.update succeeded");
     71             cursorUpdateSucceeded = true;
     72 
     73             transaction.abort();
     74           };
     75         };
     76       };
     77     };
     78 
     79     transaction.oncomplete = unexpectedCompleteCallback;
     80     transaction.onabort = function() {
     81       shouldBeTrue("storeAddSucceeded");
     82       shouldBeTrue("storePutSucceeded");
     83       shouldBeTrue("cursorUpdateSucceeded");
     84       testOverLimit();
     85     };
     86   }
     87 }
     88 
     89 function testOverLimit()
     90 {
     91   debug("");
     92   debug('Creating test value over limit');
     93   var overLimit;
     94   setTimeout(
     95     function () {
     96       overLimit = value + repeat(SEED, SLOP * 2);
     97       setTimeout(doStore, 0);
     98     }, 0);
     99 
    100   function doStore() {
    101     var transaction = db.transaction("store", 'readwrite');
    102     var store = transaction.objectStore("store");
    103     var request;
    104 
    105     debug("store.add overLimit");
    106     request = store.add(overLimit, key++);
    107     request.onsuccess = unexpectedSuccessCallback;
    108     request.onerror = function (e) {
    109       debug("store.add failed: " + e.target.webkitErrorMessage);
    110       storeAddFailed = true;
    111       e.preventDefault();
    112 
    113       debug("store.put overLimit");
    114       request = store.put(overLimit, key++);
    115       request.onsuccess = unexpectedSuccessCallback;
    116       request.onerror = function (e) {
    117         debug("store.put failed: " + e.target.webkitErrorMessage);
    118         storePutFailed = true;
    119         e.preventDefault();
    120 
    121         debug("cursor.update overLimit");
    122         request = store.openCursor();
    123         request.onerror = unexpectedErrorCallback;
    124         request.onsuccess = function () {
    125           var cursor = request.result;
    126           request = cursor.update(overLimit);
    127           request.onsuccess = unexpectedSuccessCallback;
    128           request.onerror = function (e) {
    129             debug("cursor.update failed: " + e.target.webkitErrorMessage);
    130             cursorUpdateFailed = true;
    131           };
    132         };
    133       };
    134     };
    135 
    136     transaction.oncomplete = unexpectedCompleteCallback;
    137     transaction.onabort = function() {
    138       shouldBeTrue("storeAddFailed");
    139       shouldBeTrue("storePutFailed");
    140       shouldBeTrue("cursorUpdateFailed");
    141       done();
    142     };
    143   }
    144 }
    145