164 lines
6.2 KiB
JavaScript
164 lines
6.2 KiB
JavaScript
if (this.importScripts) {
|
|
importScripts('../../../resources/js-test.js');
|
|
importScripts('shared.js');
|
|
}
|
|
|
|
description("Test for valid and invalid keypaths");
|
|
|
|
indexedDBTest(prepareDatabase);
|
|
function prepareDatabase()
|
|
{
|
|
db = event.target.result;
|
|
event.target.transaction.onabort = unexpectedAbortCallback;
|
|
evalAndLog("store = db.createObjectStore('name')");
|
|
shouldBeNull("store.keyPath");
|
|
deleteAllObjectStores(db);
|
|
|
|
testKeyPaths = [
|
|
{ keyPath: "''" },
|
|
{ keyPath: "'foo'" },
|
|
{ keyPath: "'foo.bar.baz'" },
|
|
|
|
// IdentifierStart
|
|
{ keyPath: "'$'" },
|
|
{ keyPath: "'_'" },
|
|
{ keyPath: "'\\u0391'" }, // GREEK CAPITAL LETTER ALPHA (Lc)
|
|
{ keyPath: "'\\u0371'" }, // GREEK SMALL LETTER ALPHA (Lu)
|
|
{ keyPath: "'\\u01C5'" }, // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (Lt)
|
|
{ keyPath: "'\\u02B0'" }, // MODIFIER LETTER SMALL H (Lm)
|
|
{ keyPath: "'\\u00AA'" }, // FEMININE ORDINAL INDICATOR (Lo)
|
|
{ keyPath: "'\\u16EE'" }, // RUNIC ARLAUG SYMBOL (Nl)
|
|
|
|
// IdentifierPart
|
|
{ keyPath: "'_$'" },
|
|
{ keyPath: "'__'" },
|
|
{ keyPath: "'_\\u0391'" }, // GREEK CAPITAL LETTER ALPHA (Lc)
|
|
{ keyPath: "'_\\u0371'" }, // GREEK SMALL LETTER ALPHA (Lu)
|
|
{ keyPath: "'_\\u01C5'" }, // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (Lt)
|
|
{ keyPath: "'_\\u02B0'" }, // MODIFIER LETTER SMALL H (Lm)
|
|
{ keyPath: "'_\\u00AA'" }, // FEMININE ORDINAL INDICATOR (Lo)
|
|
{ keyPath: "'_\\u16EE'" }, // RUNIC ARLAUG SYMBOL (Nl)
|
|
{ keyPath: "'_\\u0300'" }, // COMBINING GRAVE ACCENT (Mn)
|
|
{ keyPath: "'_\\u0903'" }, // DEVANAGARI SIGN VISARGA (Mc)
|
|
{ keyPath: "'_\\u0300'" }, // DIGIT ZERO (Nd)
|
|
{ keyPath: "'_\\u203F'" }, // UNDERTIE (Pc)
|
|
{ keyPath: "'_\\u200C'" }, // ZWNJ
|
|
{ keyPath: "'_\\u200D'" }, // ZWJ
|
|
];
|
|
|
|
testKeyPaths.forEach(function (testCase) {
|
|
storeExpected = ('storeExpected' in testCase) ? testCase.storeExpected : testCase.keyPath;
|
|
indexExpected = ('indexExpected' in testCase) ? testCase.indexExpected : testCase.keyPath;
|
|
|
|
evalAndLog("store = db.createObjectStore('name', {keyPath: " + testCase.keyPath + "})");
|
|
shouldBe("store.keyPath", storeExpected);
|
|
evalAndLog("index = store.createIndex('name', " + testCase.keyPath + ")");
|
|
shouldBe("index.keyPath", indexExpected);
|
|
deleteAllObjectStores(db);
|
|
});
|
|
|
|
evalAndLog("store = db.createObjectStore('name', {keyPath: 'undefined'})");
|
|
shouldBe("store.keyPath", "'undefined'");
|
|
evalAndLog("index = store.createIndex('name', undefined)");
|
|
shouldBe("index.keyPath", "'undefined'");
|
|
deleteAllObjectStores(db);
|
|
|
|
evalAndLog("store = db.createObjectStore('name', {keyPath: 'null'})");
|
|
shouldBe("store.keyPath", "'null'");
|
|
evalAndLog("index = store.createIndex('name', null)");
|
|
shouldBe("index.keyPath", "'null'");
|
|
deleteAllObjectStores(db);
|
|
|
|
testInvalidKeyPaths();
|
|
}
|
|
|
|
function testInvalidKeyPaths()
|
|
{
|
|
debug("");
|
|
debug("testInvalidKeyPaths():");
|
|
deleteAllObjectStores(db);
|
|
|
|
debug("");
|
|
debug("Object store key path may not be empty or an array if autoIncrement is true");
|
|
testKeyPaths = ["''", "['a']", "['']"];
|
|
testKeyPaths.forEach(function (keyPath) {
|
|
store = evalAndExpectException("store = db.createObjectStore('storeName', {autoIncrement: true, keyPath: " + keyPath + "})", "DOMException.INVALID_ACCESS_ERR");
|
|
deleteAllObjectStores(db);
|
|
});
|
|
|
|
debug("");
|
|
debug("Key paths which are never valid:");
|
|
|
|
testKeyPaths = [
|
|
"' '",
|
|
"'foo '",
|
|
"'foo bar'",
|
|
"'foo. bar'",
|
|
"'foo .bar'",
|
|
"'foo..bar'",
|
|
"'+foo'",
|
|
"'foo%'",
|
|
"'1'",
|
|
"'1.0'",
|
|
"[]",
|
|
|
|
// IdentifierPart but not IdentifierStart
|
|
"'\\u0300'", // COMBINING GRAVE ACCENT (Mn)
|
|
"'\\u0903'", // DEVANAGARI SIGN VISARGA (Mc)
|
|
"'\\u0300'", // DIGIT ZERO (Nd)
|
|
"'\\u203F'", // UNDERTIE (Pc)
|
|
"'\\u200C'", // ZWNJ
|
|
"'\\u200D'", // ZWJ
|
|
|
|
// Neither IdentifierPart nor IdentifierStart
|
|
"'\\u002D'", // HYPHEN-MINUS (Pd)
|
|
"'\\u0028'", // LEFT PARENTHESIS (Ps)
|
|
"'\\u0029'", // RIGHT PARENTHESIS (Pe)
|
|
"'\\u00AB'", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (Pi)
|
|
"'\\u00BB'", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (Pf)
|
|
"'\\u0021'", // EXCLAMATION MARK (Po)
|
|
"'\\u002B'", // PLUS SIGN (Sm)
|
|
"'\\u00A2'", // CENT SIGN (Sc)
|
|
"'\\u005E'", // CIRCUMFLEX ACCENT (Sk)
|
|
"'\\u00A6'", // BROKEN BAR (So)
|
|
"'\\u00A0'", // NO-BREAK SPACE (Zs)
|
|
"'\\u2028'", // LINE SEPARATOR (Zl)
|
|
"'\\u2029'", // PARAGRAPH SEPARATOR (Zp)
|
|
"'\\u0000'", // NULL (Cc)
|
|
"'\\u00AD'", // SOFT HYPHEN (Cf)
|
|
"'\\uD800'", // Surrogate (Cs)
|
|
"'\\uE000'", // Private Use (Co)
|
|
"'\\uFFFE'", // Special
|
|
"'\\uFFFF'", // Special
|
|
|
|
// Neither IdentifierPart nor IdentifierStart
|
|
"'_\\u002D'", // HYPHEN-MINUS (Pd)
|
|
"'_\\u0028'", // LEFT PARENTHESIS (Ps)
|
|
"'_\\u0029'", // RIGHT PARENTHESIS (Pe)
|
|
"'_\\u00AB'", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (Pi)
|
|
"'_\\u00BB'", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (Pf)
|
|
"'_\\u0021'", // EXCLAMATION MARK (Po)
|
|
"'_\\u002B'", // PLUS SIGN (Sm)
|
|
"'_\\u00A2'", // CENT SIGN (Sc)
|
|
"'_\\u005E'", // CIRCUMFLEX ACCENT (Sk)
|
|
"'_\\u00A6'", // BROKEN BAR (So)
|
|
"'_\\u00A0'", // NO-BREAK SPACE (Zs)
|
|
"'_\\u2028'", // LINE SEPARATOR (Zl)
|
|
"'_\\u2029'", // PARAGRAPH SEPARATOR (Zp)
|
|
"'_\\u0000'", // NULL (Cc)
|
|
"'_\\u00AD'", // SOFT HYPHEN (Cf)
|
|
"'_\\uD800'", // Surrogate (Cs)
|
|
"'_\\uE000'", // Private Use (Co)
|
|
"'_\\uFFFE'", // Special
|
|
"'_\\uFFFF'" // Special
|
|
];
|
|
|
|
testKeyPaths.forEach(function (keyPath) {
|
|
evalAndExpectException("db.createObjectStore('name', {keyPath: " + keyPath + "})", "DOMException.SYNTAX_ERR");
|
|
evalAndExpectException("db.createObjectStore('name').createIndex('name', " + keyPath + ")", "DOMException.SYNTAX_ERR");
|
|
deleteAllObjectStores(db);
|
|
});
|
|
|
|
finishJSTest();
|
|
}
|