15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function test() { 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window.webkitStorageInfo) { 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.jsTestIsAsync = true; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY, 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initUsageCallback, 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unexpectedErrorCallback); 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("This test requires window.webkitStorageInfo."); 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function initUsageCallback(usage, quota) { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origReturnedUsage = returnedUsage = usage; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origReturnedQuota = returnedQuota = quota; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("original quota is " + displaySize(origReturnedQuota)); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("original usage is " + displaySize(origReturnedUsage)); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) indexedDBTest(prepareDatabase, initQuotaEnforcing); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function prepareDatabase() 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) db = event.target.result; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objectStore = db.createObjectStore("test123"); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function displaySize(bytes) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var k = bytes / 1024; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var m = k / 1024; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bytes + " (" + k + "k) (" + m + "m)"; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function initQuotaEnforcing() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var availableSpace = origReturnedQuota - origReturnedUsage; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var kMaxMbPerWrite = 5; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var kMinWrites = 5; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var len = Math.min(kMaxMbPerWrite * 1024 * 1024, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Math.floor(availableSpace / kMinWrites)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maxExpectedWrites = Math.floor(availableSpace / len) + 1; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("Chunk size: " + displaySize(len)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("Expecting at most " + maxExpectedWrites + " writes, but we could " + 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "have more if snappy is used or LevelDB is about to compact."); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = Array(1+len).join("X"); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dataLength = data.length; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dataAdded = 0; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) successfulWrites = 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startNewTransaction(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function startNewTransaction() { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dataAdded > origReturnedQuota) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail("dataAdded > quota " + dataAdded + " > " + origReturnedQuota); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug(""); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("Starting new transaction."); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var trans = db.transaction(['test123'], 'readwrite'); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trans.onabort = onAbort; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trans.oncomplete = getQuotaAndUsage; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var store = trans.objectStore('test123'); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request = store.put({x: data}, dataAdded); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.onerror = logError; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getQuotaAndUsage() { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) successfulWrites++; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (successfulWrites > maxExpectedWrites) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("Weird: too many writes. There were " + successfulWrites + 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " but we only expected " + maxExpectedWrites); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usageCallback, unexpectedErrorCallback); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function usageCallback(usage, quota) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("Transaction finished."); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dataAdded += dataLength; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("We've added "+ displaySize(dataAdded)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnedUsage = usage; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnedQuota = quota; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("Allotted quota is " + displaySize(returnedQuota)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("LevelDB usage is " + displaySize(returnedUsage)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startNewTransaction(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function onAbort() { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shouldBeEqualToString("event.target.error.name", "QuotaExceededError"); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done("Transaction aborted. Data added: " + displaySize(dataAdded)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug("There were " + successfulWrites + " successful writes"); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function logError() { 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) debug("Error function called: (" + event.target.error.name + ") " + 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.target.error.message); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.preventDefault(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 101