// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. function test() { if (window.webkitStorageInfo) { window.jsTestIsAsync = true; webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY, initUsageCallback, unexpectedErrorCallback); } else debug("This test requires window.webkitStorageInfo."); } function initUsageCallback(usage, quota) { origReturnedUsage = returnedUsage = usage; origReturnedQuota = returnedQuota = quota; debug("original quota is " + displaySize(origReturnedQuota)); debug("original usage is " + displaySize(origReturnedUsage)); indexedDBTest(prepareDatabase, initQuotaEnforcing); } function prepareDatabase() { db = event.target.result; objectStore = db.createObjectStore("test123"); } function displaySize(bytes) { var k = bytes / 1024; var m = k / 1024; return bytes + " (" + k + "k) (" + m + "m)"; } function initQuotaEnforcing() { var availableSpace = origReturnedQuota - origReturnedUsage; var kMaxMbPerWrite = 5; var kMinWrites = 5; var len = Math.min(kMaxMbPerWrite * 1024 * 1024, Math.floor(availableSpace / kMinWrites)); maxExpectedWrites = Math.floor(availableSpace / len) + 1; debug("Chunk size: " + displaySize(len)); debug("Expecting at most " + maxExpectedWrites + " writes, but we could " + "have more if snappy is used or LevelDB is about to compact."); data = Array(1+len).join("X"); dataLength = data.length; dataAdded = 0; successfulWrites = 0; startNewTransaction(); } function startNewTransaction() { if (dataAdded > origReturnedQuota) { fail("dataAdded > quota " + dataAdded + " > " + origReturnedQuota); return; } debug(""); debug("Starting new transaction."); var trans = db.transaction(['test123'], 'readwrite'); trans.onabort = onAbort; trans.oncomplete = getQuotaAndUsage; var store = trans.objectStore('test123'); request = store.put({x: data}, dataAdded); request.onerror = logError; } function getQuotaAndUsage() { successfulWrites++; if (successfulWrites > maxExpectedWrites) { debug("Weird: too many writes. There were " + successfulWrites + " but we only expected " + maxExpectedWrites); } webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY, usageCallback, unexpectedErrorCallback); } function usageCallback(usage, quota) { debug("Transaction finished."); dataAdded += dataLength; debug("We've added "+ displaySize(dataAdded)); returnedUsage = usage; returnedQuota = quota; debug("Allotted quota is " + displaySize(returnedQuota)); debug("LevelDB usage is " + displaySize(returnedUsage)); startNewTransaction(); } function onAbort() { shouldBeEqualToString("event.target.error.name", "QuotaExceededError"); done("Transaction aborted. Data added: " + displaySize(dataAdded)); debug("There were " + successfulWrites + " successful writes"); } function logError() { debug("Error function called: (" + event.target.error.name + ") " + event.target.error.message); event.preventDefault(); }