// 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 debug(message)
{
var span = document.createElement("span");
span.appendChild(document.createTextNode(message));
span.appendChild(document.createElement("br"));
document.getElementById('status').appendChild(span);
}
function done(message)
{
if (document.location.hash == '#fail')
return;
if (message)
debug('PASS: ' + message);
else
debug('PASS');
document.location.hash = '#pass';
}
function fail(message)
{
debug('FAILED: ' + message);
document.location.hash = '#fail';
}
function getLog()
{
return "" + document.getElementById('status').innerHTML;
}
function unexpectedUpgradeNeededCallback()
{
fail('unexpectedUpgradeNeededCallback');
}
function unexpectedAbortCallback()
{
fail('unexpectedAbortCallback');
}
function unexpectedSuccessCallback()
{
fail('unexpectedSuccessCallback');
}
function unexpectedCompleteCallback()
{
fail('unexpectedCompleteCallback');
}
function unexpectedErrorCallback()
{
fail('unexpectedErrorCallback');
}
function unexpectedBlockedCallback()
{
fail('unexpectedBlockedCallback');
}
function unexpectedUpgradeNeededCallback()
{
fail('unexpectedUpgradeNeededCallback');
}
function deleteAllObjectStores(db)
{
objectStoreNames = db.objectStoreNames;
for (var i = 0; i < objectStoreNames.length; ++i)
db.deleteObjectStore(objectStoreNames[i]);
}
// The following functions are based on
// WebKit/LayoutTests/fast/js/resources/js-test-pre.js
// so that the tests will look similar to the existing layout tests.
function stringify(v)
{
if (v === 0 && 1/v < 0)
return "-0";
else return "" + v;
}
function isResultCorrect(_actual, _expected)
{
if (_expected === 0)
return _actual === _expected && (1/_actual) === (1/_expected);
if (_actual === _expected)
return true;
if (typeof(_expected) == "number" && isNaN(_expected))
return typeof(_actual) == "number" && isNaN(_actual);
if (Object.prototype.toString.call(_expected) ==
Object.prototype.toString.call([]))
return areArraysEqual(_actual, _expected);
return false;
}
function shouldBe(_a, _b)
{
if (typeof _a != "string" || typeof _b != "string")
debug("WARN: shouldBe() expects string arguments");
var exception;
var _av;
try {
_av = eval(_a);
} catch (e) {
exception = e;
}
var _bv = eval(_b);
if (exception)
fail(_a + " should be " + _bv + ". Threw exception " + exception);
else if (isResultCorrect(_av, _bv))
debug(_a + " is " + _b);
else if (typeof(_av) == typeof(_bv))
fail(_a + " should be " + _bv + ". Was " + stringify(_av) + ".");
else
fail(_a + " should be " + _bv + " (of type " + typeof _bv + "). " +
"Was " + _av + " (of type " + typeof _av + ").");
}
function shouldBeTrue(_a) { shouldBe(_a, "true"); }
function shouldBeFalse(_a) { shouldBe(_a, "false"); }
function shouldBeNaN(_a) { shouldBe(_a, "NaN"); }
function shouldBeNull(_a) { shouldBe(_a, "null"); }
function shouldBeEqualToString(a, b)
{
var unevaledString = '"' + b.replace(/\\/g, "\\\\").replace(/"/g, "\"") + '"';
shouldBe(a, unevaledString);
}
function indexedDBTest(upgradeCallback, optionalOpenCallback) {
dbname = self.location.pathname.substring(
1 + self.location.pathname.lastIndexOf("/"));
var deleteRequest = indexedDB.deleteDatabase(dbname);
deleteRequest.onerror = unexpectedErrorCallback;
deleteRequest.onblocked = unexpectedBlockedCallback;
deleteRequest.onsuccess = function() {
var openRequest = indexedDB.open(dbname);
openRequest.onerror = unexpectedErrorCallback;
openRequest.onupgradeneeded = upgradeCallback;
openRequest.onblocked = unexpectedBlockedCallback;
if (optionalOpenCallback)
openRequest.onsuccess = optionalOpenCallback;
};
}
if (typeof String.prototype.startsWith !== 'function') {
String.prototype.startsWith = function (str) {
return this.indexOf(str) === 0;
};
}