Bug 1281377 - In IDBKeyRange.includes(), do not compare the given value with the unset boundary. r=khuey

This commit is contained in:
Bevis Tseng 2016-06-22 13:40:12 +08:00
Родитель daa6f72c59
Коммит 2673621c4b
2 изменённых файлов: 53 добавлений и 27 удалений

Просмотреть файл

@ -22,8 +22,7 @@ namespace {
nsresult
GetKeyFromJSVal(JSContext* aCx,
JS::Handle<JS::Value> aVal,
Key& aKey,
bool aAllowUnset = false)
Key& aKey)
{
nsresult rv = aKey.SetFromJSVal(aCx, aVal);
if (NS_FAILED(rv)) {
@ -31,7 +30,7 @@ GetKeyFromJSVal(JSContext* aCx,
return rv;
}
if (aKey.IsUnset() && !aAllowUnset) {
if (aKey.IsUnset()) {
return NS_ERROR_DOM_INDEXEDDB_DATA_ERR;
}
@ -347,39 +346,38 @@ IDBKeyRange::Includes(JSContext* aCx,
return false;
}
switch (Key::CompareKeys(Lower(), key)) {
case 1:
return false;
case 0:
// Identical keys.
if (LowerOpen()) {
MOZ_ASSERT(!(Lower().IsUnset() && Upper().IsUnset()));
MOZ_ASSERT_IF(IsOnly(),
!Lower().IsUnset() && !LowerOpen() &&
Lower() == Upper() && LowerOpen() == UpperOpen());
if (!Lower().IsUnset()) {
switch (Key::CompareKeys(Lower(), key)) {
case 1:
return false;
case 0:
// Identical keys.
return !LowerOpen();
case -1:
if (IsOnly()) {
return false;
}
break;
default:
MOZ_CRASH();
}
break;
case -1:
if (IsOnly()) {
return false;
}
break;
default:
MOZ_CRASH();
}
if (!IsOnly()) {
if (!Upper().IsUnset()) {
switch (Key::CompareKeys(key, Upper())) {
case 1:
return false;
case 0:
// Identical keys.
if (UpperOpen()) {
return false;
}
break;
return !UpperOpen();
case -1:
break;
}
} else {
MOZ_ASSERT(key == Lower());
}
return true;

Просмотреть файл

@ -5,7 +5,7 @@
<script src=/resources/testharnessreport.js></script>
<script>
test( function() {
test(function() {
var closedRange = IDBKeyRange.bound(5, 20);
assert_true(!!closedRange.includes, "IDBKeyRange has a .includes");
assert_true(closedRange.includes(7), "in range");
@ -17,17 +17,45 @@
"invalid key");
}, "IDBKeyRange.includes() with a closed range");
test( function() {
test(function() {
var openRange = IDBKeyRange.bound(5, 20, true, true);
assert_false(openRange.includes(5) || openRange.includes(20),
"boundary points");
}, "IDBKeyRange.includes() with an open range");
test( function() {
test(function() {
var range = IDBKeyRange.only(42);
assert_true(range.includes(42), "in range");
assert_false(range.includes(1), "below range");
assert_false(range.includes(9000), "above range");
}, "IDBKeyRange.includes() with an only range");
test(function() {
var range = IDBKeyRange.lowerBound(5);
assert_false(range.includes(4), 'value before closed lower bound');
assert_true(range.includes(5), 'value at closed lower bound');
assert_true(range.includes(6), 'value after closed lower bound');
}, "IDBKeyRange.includes() with an closed lower-bounded range");
test(function() {
var range = IDBKeyRange.lowerBound(5, true);
assert_false(range.includes(4), 'value before open lower bound');
assert_false(range.includes(5), 'value at open lower bound');
assert_true(range.includes(6), 'value after open lower bound');
}, "IDBKeyRange.includes() with an open lower-bounded range");
test(function() {
var range = IDBKeyRange.upperBound(5);
assert_true(range.includes(4), 'value before closed upper bound');
assert_true(range.includes(5), 'value at closed upper bound');
assert_false(range.includes(6), 'value after closed upper bound');
}, "IDBKeyRange.includes() with an closed upper-bounded range");
test(function() {
var range = IDBKeyRange.upperBound(5, true);
assert_true(range.includes(4), 'value before open upper bound');
assert_false(range.includes(5), 'value at open upper bound');
assert_false(range.includes(6), 'value after open upper bound');
}, "IDBKeyRange.includes() with an open upper-bounded range");
</script>