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 debug(message) 6 { 7 var span = document.createElement("span"); 8 span.appendChild(document.createTextNode(message)); 9 span.appendChild(document.createElement("br")); 10 document.getElementById('status').appendChild(span); 11 } 12 13 function done(message) 14 { 15 if (document.location.hash == '#fail') 16 return; 17 if (message) 18 debug('PASS: ' + message); 19 else 20 debug('PASS'); 21 document.location.hash = '#pass'; 22 } 23 24 function fail(message) 25 { 26 debug('FAILED: ' + message); 27 document.location.hash = '#fail'; 28 } 29 30 function getLog() 31 { 32 return "" + document.getElementById('status').innerHTML; 33 } 34 35 function unexpectedUpgradeNeededCallback() 36 { 37 fail('unexpectedUpgradeNeededCallback'); 38 } 39 40 function unexpectedAbortCallback() 41 { 42 fail('unexpectedAbortCallback'); 43 } 44 45 function unexpectedSuccessCallback() 46 { 47 fail('unexpectedSuccessCallback'); 48 } 49 50 function unexpectedCompleteCallback() 51 { 52 fail('unexpectedCompleteCallback'); 53 } 54 55 function unexpectedErrorCallback() 56 { 57 fail('unexpectedErrorCallback'); 58 } 59 60 function unexpectedBlockedCallback() 61 { 62 fail('unexpectedBlockedCallback'); 63 } 64 65 function unexpectedUpgradeNeededCallback() 66 { 67 fail('unexpectedUpgradeNeededCallback'); 68 } 69 70 function deleteAllObjectStores(db) 71 { 72 objectStoreNames = db.objectStoreNames; 73 for (var i = 0; i < objectStoreNames.length; ++i) 74 db.deleteObjectStore(objectStoreNames[i]); 75 } 76 77 // The following functions are based on 78 // WebKit/LayoutTests/fast/js/resources/js-test-pre.js 79 // so that the tests will look similar to the existing layout tests. 80 function stringify(v) 81 { 82 if (v === 0 && 1/v < 0) 83 return "-0"; 84 else return "" + v; 85 } 86 87 function isResultCorrect(_actual, _expected) 88 { 89 if (_expected === 0) 90 return _actual === _expected && (1/_actual) === (1/_expected); 91 if (_actual === _expected) 92 return true; 93 if (typeof(_expected) == "number" && isNaN(_expected)) 94 return typeof(_actual) == "number" && isNaN(_actual); 95 if (Object.prototype.toString.call(_expected) == 96 Object.prototype.toString.call([])) 97 return areArraysEqual(_actual, _expected); 98 return false; 99 } 100 101 function shouldBe(_a, _b) 102 { 103 if (typeof _a != "string" || typeof _b != "string") 104 debug("WARN: shouldBe() expects string arguments"); 105 var exception; 106 var _av; 107 try { 108 _av = eval(_a); 109 } catch (e) { 110 exception = e; 111 } 112 var _bv = eval(_b); 113 114 if (exception) 115 fail(_a + " should be " + _bv + ". Threw exception " + exception); 116 else if (isResultCorrect(_av, _bv)) 117 debug(_a + " is " + _b); 118 else if (typeof(_av) == typeof(_bv)) 119 fail(_a + " should be " + _bv + ". Was " + stringify(_av) + "."); 120 else 121 fail(_a + " should be " + _bv + " (of type " + typeof _bv + "). " + 122 "Was " + _av + " (of type " + typeof _av + ")."); 123 } 124 125 function shouldBeTrue(_a) { shouldBe(_a, "true"); } 126 function shouldBeFalse(_a) { shouldBe(_a, "false"); } 127 function shouldBeNaN(_a) { shouldBe(_a, "NaN"); } 128 function shouldBeNull(_a) { shouldBe(_a, "null"); } 129 function shouldBeEqualToString(a, b) 130 { 131 var unevaledString = '"' + b.replace(/\\/g, "\\\\").replace(/"/g, "\"") + '"'; 132 shouldBe(a, unevaledString); 133 } 134 135 function indexedDBTest(upgradeCallback, optionalOpenCallback) { 136 dbname = self.location.pathname.substring( 137 1 + self.location.pathname.lastIndexOf("/")); 138 var deleteRequest = indexedDB.deleteDatabase(dbname); 139 deleteRequest.onerror = unexpectedErrorCallback; 140 deleteRequest.onblocked = unexpectedBlockedCallback; 141 deleteRequest.onsuccess = function() { 142 var openRequest = indexedDB.open(dbname); 143 openRequest.onerror = unexpectedErrorCallback; 144 openRequest.onupgradeneeded = upgradeCallback; 145 openRequest.onblocked = unexpectedBlockedCallback; 146 if (optionalOpenCallback) 147 openRequest.onsuccess = optionalOpenCallback; 148 }; 149 } 150 151 if (typeof String.prototype.startsWith !== 'function') { 152 String.prototype.startsWith = function (str) { 153 return this.indexOf(str) === 0; 154 }; 155 } 156