IndexedDB 2.0: Support new IDBKeyRange interfaces.
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Oct 2016 00:05:24 +0000 (00:05 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Oct 2016 00:05:24 +0000 (00:05 +0000)
<rdar://problem/28806929> and https://bugs.webkit.org/show_bug.cgi?id=163910

Reviewed by Andy Estes.

Source/WebCore:

No new tests (Covered by additions to existing test)

The "new IDBKeyRanges interfaces" really just means adding the instance method IDBKeyRange.contains.

* Modules/indexeddb/IDBKeyRange.cpp:
(WebCore::IDBKeyRange::contains):
* Modules/indexeddb/IDBKeyRange.h:
* Modules/indexeddb/IDBKeyRange.idl:

LayoutTests:

* storage/indexeddb/keyrange-expected.txt:
* storage/indexeddb/keyrange-private-expected.txt:
* storage/indexeddb/resources/keyrange.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207788 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/storage/indexeddb/keyrange-expected.txt
LayoutTests/storage/indexeddb/keyrange-private-expected.txt
LayoutTests/storage/indexeddb/resources/keyrange.js
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBKeyRange.cpp
Source/WebCore/Modules/indexeddb/IDBKeyRange.h
Source/WebCore/Modules/indexeddb/IDBKeyRange.idl

index 58ddad3..be8ed14 100644 (file)
@@ -1,3 +1,14 @@
+2016-10-24  Brady Eidson  <beidson@apple.com>
+
+        IndexedDB 2.0: Support new IDBKeyRange interfaces.
+        <rdar://problem/28806929> and https://bugs.webkit.org/show_bug.cgi?id=163910
+
+        Reviewed by Andy Estes.
+
+        * storage/indexeddb/keyrange-expected.txt:
+        * storage/indexeddb/keyrange-private-expected.txt:
+        * storage/indexeddb/resources/keyrange.js:
+
 2016-10-23  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [DOMJIT] Add a way for DOMJIT::Patchpoint to express effects
index 437bd84..976f580 100644 (file)
@@ -9,6 +9,7 @@ PASS 'lower' in IDBKeyRange is false
 PASS 'upper' in IDBKeyRange is false
 PASS 'lowerOpen' in IDBKeyRange is false
 PASS 'upperOpen' in IDBKeyRange is false
+PASS 'contains' in IDBKeyRange is false
 PASS 'only' in IDBKeyRange is true
 PASS 'lowerBound' in IDBKeyRange is true
 PASS 'upperBound' in IDBKeyRange is true
@@ -19,6 +20,7 @@ PASS 'lower' in instance is true
 PASS 'upper' in instance is true
 PASS 'lowerOpen' in instance is true
 PASS 'upperOpen' in instance is true
+PASS 'contains' in instance is true
 PASS 'only' in instance is false
 PASS 'lowerBound' in instance is false
 PASS 'upperBound' in instance is false
@@ -29,186 +31,281 @@ PASS keyRange.lower is 1
 PASS keyRange.upper is 1
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(1.1) is false
+PASS keyRange.contains(0.9) is false
+PASS keyRange.contains(1) is true
 IDBKeyRange.only(3.14)
 PASS keyRange.lower is 3.14
 PASS keyRange.upper is 3.14
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(3.24) is false
+PASS keyRange.contains(3.04) is false
+PASS keyRange.contains(3.14) is true
 IDBKeyRange.only('a')
 PASS keyRange.lower is 'a'
 PASS keyRange.upper is 'a'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aa') is false
+PASS keyRange.contains('') is false
+PASS keyRange.contains('a') is true
 IDBKeyRange.lowerBound(10,true)
 PASS keyRange.lower is 10
 PASS keyRange.lowerOpen is true
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(10) is false
+PASS keyRange.contains(10.1) is true
+PASS keyRange.contains(9.9) is false
 IDBKeyRange.lowerBound(11,false)
 PASS keyRange.lower is 11
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(11) is true
+PASS keyRange.contains(11.1) is true
+PASS keyRange.contains(10.9) is false
 IDBKeyRange.lowerBound(12,undefined)
 PASS keyRange.lower is 12
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(12) is true
+PASS keyRange.contains(12.1) is true
+PASS keyRange.contains(11.9) is false
 IDBKeyRange.lowerBound(10.1,true)
 PASS keyRange.lower is 10.1
 PASS keyRange.lowerOpen is true
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(10.1) is false
+PASS keyRange.contains(10.2) is true
+PASS keyRange.contains(10) is false
 IDBKeyRange.lowerBound(11.2,false)
 PASS keyRange.lower is 11.2
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(11.2) is true
+PASS keyRange.contains(11.299999999999999) is true
+PASS keyRange.contains(11.1) is false
 IDBKeyRange.lowerBound(12.3,undefined)
 PASS keyRange.lower is 12.3
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(12.3) is true
+PASS keyRange.contains(12.4) is true
+PASS keyRange.contains(12.200000000000001) is false
 IDBKeyRange.lowerBound('aa',true)
 PASS keyRange.lower is 'aa'
 PASS keyRange.lowerOpen is true
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('aa') is false
+PASS keyRange.contains('aaa') is true
+PASS keyRange.contains('a') is false
 IDBKeyRange.lowerBound('ab',false)
 PASS keyRange.lower is 'ab'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('ab') is true
+PASS keyRange.contains('abb') is true
+PASS keyRange.contains('a') is false
 IDBKeyRange.lowerBound('ac',undefined)
 PASS keyRange.lower is 'ac'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('ac') is true
+PASS keyRange.contains('acc') is true
+PASS keyRange.contains('a') is false
 IDBKeyRange.upperBound(20,true)
 PASS keyRange.upper is 20
 PASS keyRange.upperOpen is true
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(20) is false
+PASS keyRange.contains(20.1) is false
+PASS keyRange.contains(19.9) is true
 IDBKeyRange.upperBound(21,false)
 PASS keyRange.upper is 21
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(21) is true
+PASS keyRange.contains(21.1) is false
+PASS keyRange.contains(20.9) is true
 IDBKeyRange.upperBound(22,undefined)
 PASS keyRange.upper is 22
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(22) is true
+PASS keyRange.contains(22.1) is false
+PASS keyRange.contains(21.9) is true
 IDBKeyRange.upperBound(20.2,true)
 PASS keyRange.upper is 20.2
 PASS keyRange.upperOpen is true
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(20.2) is false
+PASS keyRange.contains(20.3) is false
+PASS keyRange.contains(20.099999999999998) is true
 IDBKeyRange.upperBound(21.3,false)
 PASS keyRange.upper is 21.3
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(21.3) is true
+PASS keyRange.contains(21.400000000000002) is false
+PASS keyRange.contains(21.2) is true
 IDBKeyRange.upperBound(22.4,undefined)
 PASS keyRange.upper is 22.4
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(22.4) is true
+PASS keyRange.contains(22.5) is false
+PASS keyRange.contains(22.299999999999997) is true
 IDBKeyRange.upperBound('ba',true)
 PASS keyRange.upper is 'ba'
 PASS keyRange.upperOpen is true
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains('ba') is false
+PASS keyRange.contains('baa') is false
+PASS keyRange.contains('b') is true
 IDBKeyRange.upperBound('bb',false)
 PASS keyRange.upper is 'bb'
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains('bb') is true
+PASS keyRange.contains('bbb') is false
+PASS keyRange.contains('b') is true
 IDBKeyRange.upperBound('bc',undefined)
 PASS keyRange.upper is 'bc'
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains('bc') is true
+PASS keyRange.contains('bcc') is false
+PASS keyRange.contains('b') is true
 IDBKeyRange.bound(30,40, undefined, undefined)
 PASS keyRange.lower is 30
 PASS keyRange.upper is 40
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(30) is true
+PASS keyRange.contains(40) is true
 IDBKeyRange.bound(31,41, false, false)
 PASS keyRange.lower is 31
 PASS keyRange.upper is 41
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(31) is true
+PASS keyRange.contains(41) is true
 IDBKeyRange.bound(32,42, false, true)
 PASS keyRange.lower is 32
 PASS keyRange.upper is 42
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(32) is true
+PASS keyRange.contains(42) is false
 IDBKeyRange.bound(33,43, true, false)
 PASS keyRange.lower is 33
 PASS keyRange.upper is 43
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(33) is false
+PASS keyRange.contains(43) is true
 IDBKeyRange.bound(34,44, true, true)
 PASS keyRange.lower is 34
 PASS keyRange.upper is 44
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(34) is false
+PASS keyRange.contains(44) is false
 IDBKeyRange.bound(30.1,40.2, undefined, undefined)
 PASS keyRange.lower is 30.1
 PASS keyRange.upper is 40.2
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(30.1) is true
+PASS keyRange.contains(40.2) is true
 IDBKeyRange.bound(31.3,41.4, false, false)
 PASS keyRange.lower is 31.3
 PASS keyRange.upper is 41.4
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(31.3) is true
+PASS keyRange.contains(41.4) is true
 IDBKeyRange.bound(32.5,42.6, false, true)
 PASS keyRange.lower is 32.5
 PASS keyRange.upper is 42.6
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(32.5) is true
+PASS keyRange.contains(42.6) is false
 IDBKeyRange.bound(33.7,43.8, true, false)
 PASS keyRange.lower is 33.7
 PASS keyRange.upper is 43.8
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(33.7) is false
+PASS keyRange.contains(43.8) is true
 IDBKeyRange.bound(34.9,44, true, true)
 PASS keyRange.lower is 34.9
 PASS keyRange.upper is 44
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(34.9) is false
+PASS keyRange.contains(44) is false
 IDBKeyRange.bound('aaa','aba', false, false)
 PASS keyRange.lower is 'aaa'
 PASS keyRange.upper is 'aba'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aaa') is true
+PASS keyRange.contains('aba') is true
 IDBKeyRange.bound('aab','abb', undefined, undefined)
 PASS keyRange.lower is 'aab'
 PASS keyRange.upper is 'abb'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aab') is true
+PASS keyRange.contains('abb') is true
 IDBKeyRange.bound('aac','abc', false, false)
 PASS keyRange.lower is 'aac'
 PASS keyRange.upper is 'abc'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aac') is true
+PASS keyRange.contains('abc') is true
 IDBKeyRange.bound('aad','abd', false, true)
 PASS keyRange.lower is 'aad'
 PASS keyRange.upper is 'abd'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('aad') is true
+PASS keyRange.contains('abd') is false
 IDBKeyRange.bound('aae','abe', true, false)
 PASS keyRange.lower is 'aae'
 PASS keyRange.upper is 'abe'
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aae') is false
+PASS keyRange.contains('abe') is true
 IDBKeyRange.bound('aaf','abf', true, true)
 PASS keyRange.lower is 'aaf'
 PASS keyRange.upper is 'abf'
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('aaf') is false
+PASS keyRange.contains('abf') is false
 Passing an invalid key into only({})
 Expecting exception from IDBKeyRange.only({})
 PASS Exception was thrown.
@@ -270,6 +367,12 @@ PASS code is 0
 PASS ename is 'DataError'
 Exception message: The data provided does not meet requirements.
 Equal keys, none of the bounds is open, bound(4, 4, false, false)
+Passing an invalid key in to IDBKeyRange.contains({})
+Expecting exception from invalidKeyKeyRange.contains({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'contains' on 'IDBKeyRange': The passed-in value is not a valid IndexedDB key.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 437bd84..976f580 100644 (file)
@@ -9,6 +9,7 @@ PASS 'lower' in IDBKeyRange is false
 PASS 'upper' in IDBKeyRange is false
 PASS 'lowerOpen' in IDBKeyRange is false
 PASS 'upperOpen' in IDBKeyRange is false
+PASS 'contains' in IDBKeyRange is false
 PASS 'only' in IDBKeyRange is true
 PASS 'lowerBound' in IDBKeyRange is true
 PASS 'upperBound' in IDBKeyRange is true
@@ -19,6 +20,7 @@ PASS 'lower' in instance is true
 PASS 'upper' in instance is true
 PASS 'lowerOpen' in instance is true
 PASS 'upperOpen' in instance is true
+PASS 'contains' in instance is true
 PASS 'only' in instance is false
 PASS 'lowerBound' in instance is false
 PASS 'upperBound' in instance is false
@@ -29,186 +31,281 @@ PASS keyRange.lower is 1
 PASS keyRange.upper is 1
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(1.1) is false
+PASS keyRange.contains(0.9) is false
+PASS keyRange.contains(1) is true
 IDBKeyRange.only(3.14)
 PASS keyRange.lower is 3.14
 PASS keyRange.upper is 3.14
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(3.24) is false
+PASS keyRange.contains(3.04) is false
+PASS keyRange.contains(3.14) is true
 IDBKeyRange.only('a')
 PASS keyRange.lower is 'a'
 PASS keyRange.upper is 'a'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aa') is false
+PASS keyRange.contains('') is false
+PASS keyRange.contains('a') is true
 IDBKeyRange.lowerBound(10,true)
 PASS keyRange.lower is 10
 PASS keyRange.lowerOpen is true
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(10) is false
+PASS keyRange.contains(10.1) is true
+PASS keyRange.contains(9.9) is false
 IDBKeyRange.lowerBound(11,false)
 PASS keyRange.lower is 11
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(11) is true
+PASS keyRange.contains(11.1) is true
+PASS keyRange.contains(10.9) is false
 IDBKeyRange.lowerBound(12,undefined)
 PASS keyRange.lower is 12
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(12) is true
+PASS keyRange.contains(12.1) is true
+PASS keyRange.contains(11.9) is false
 IDBKeyRange.lowerBound(10.1,true)
 PASS keyRange.lower is 10.1
 PASS keyRange.lowerOpen is true
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(10.1) is false
+PASS keyRange.contains(10.2) is true
+PASS keyRange.contains(10) is false
 IDBKeyRange.lowerBound(11.2,false)
 PASS keyRange.lower is 11.2
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(11.2) is true
+PASS keyRange.contains(11.299999999999999) is true
+PASS keyRange.contains(11.1) is false
 IDBKeyRange.lowerBound(12.3,undefined)
 PASS keyRange.lower is 12.3
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(12.3) is true
+PASS keyRange.contains(12.4) is true
+PASS keyRange.contains(12.200000000000001) is false
 IDBKeyRange.lowerBound('aa',true)
 PASS keyRange.lower is 'aa'
 PASS keyRange.lowerOpen is true
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('aa') is false
+PASS keyRange.contains('aaa') is true
+PASS keyRange.contains('a') is false
 IDBKeyRange.lowerBound('ab',false)
 PASS keyRange.lower is 'ab'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('ab') is true
+PASS keyRange.contains('abb') is true
+PASS keyRange.contains('a') is false
 IDBKeyRange.lowerBound('ac',undefined)
 PASS keyRange.lower is 'ac'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upper is undefined.
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('ac') is true
+PASS keyRange.contains('acc') is true
+PASS keyRange.contains('a') is false
 IDBKeyRange.upperBound(20,true)
 PASS keyRange.upper is 20
 PASS keyRange.upperOpen is true
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(20) is false
+PASS keyRange.contains(20.1) is false
+PASS keyRange.contains(19.9) is true
 IDBKeyRange.upperBound(21,false)
 PASS keyRange.upper is 21
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(21) is true
+PASS keyRange.contains(21.1) is false
+PASS keyRange.contains(20.9) is true
 IDBKeyRange.upperBound(22,undefined)
 PASS keyRange.upper is 22
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(22) is true
+PASS keyRange.contains(22.1) is false
+PASS keyRange.contains(21.9) is true
 IDBKeyRange.upperBound(20.2,true)
 PASS keyRange.upper is 20.2
 PASS keyRange.upperOpen is true
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(20.2) is false
+PASS keyRange.contains(20.3) is false
+PASS keyRange.contains(20.099999999999998) is true
 IDBKeyRange.upperBound(21.3,false)
 PASS keyRange.upper is 21.3
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(21.3) is true
+PASS keyRange.contains(21.400000000000002) is false
+PASS keyRange.contains(21.2) is true
 IDBKeyRange.upperBound(22.4,undefined)
 PASS keyRange.upper is 22.4
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains(22.4) is true
+PASS keyRange.contains(22.5) is false
+PASS keyRange.contains(22.299999999999997) is true
 IDBKeyRange.upperBound('ba',true)
 PASS keyRange.upper is 'ba'
 PASS keyRange.upperOpen is true
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains('ba') is false
+PASS keyRange.contains('baa') is false
+PASS keyRange.contains('b') is true
 IDBKeyRange.upperBound('bb',false)
 PASS keyRange.upper is 'bb'
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains('bb') is true
+PASS keyRange.contains('bbb') is false
+PASS keyRange.contains('b') is true
 IDBKeyRange.upperBound('bc',undefined)
 PASS keyRange.upper is 'bc'
 PASS keyRange.upperOpen is false
 PASS keyRange.lower is undefined.
 PASS keyRange.lowerOpen is true
+PASS keyRange.contains('bc') is true
+PASS keyRange.contains('bcc') is false
+PASS keyRange.contains('b') is true
 IDBKeyRange.bound(30,40, undefined, undefined)
 PASS keyRange.lower is 30
 PASS keyRange.upper is 40
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(30) is true
+PASS keyRange.contains(40) is true
 IDBKeyRange.bound(31,41, false, false)
 PASS keyRange.lower is 31
 PASS keyRange.upper is 41
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(31) is true
+PASS keyRange.contains(41) is true
 IDBKeyRange.bound(32,42, false, true)
 PASS keyRange.lower is 32
 PASS keyRange.upper is 42
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(32) is true
+PASS keyRange.contains(42) is false
 IDBKeyRange.bound(33,43, true, false)
 PASS keyRange.lower is 33
 PASS keyRange.upper is 43
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(33) is false
+PASS keyRange.contains(43) is true
 IDBKeyRange.bound(34,44, true, true)
 PASS keyRange.lower is 34
 PASS keyRange.upper is 44
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(34) is false
+PASS keyRange.contains(44) is false
 IDBKeyRange.bound(30.1,40.2, undefined, undefined)
 PASS keyRange.lower is 30.1
 PASS keyRange.upper is 40.2
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(30.1) is true
+PASS keyRange.contains(40.2) is true
 IDBKeyRange.bound(31.3,41.4, false, false)
 PASS keyRange.lower is 31.3
 PASS keyRange.upper is 41.4
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(31.3) is true
+PASS keyRange.contains(41.4) is true
 IDBKeyRange.bound(32.5,42.6, false, true)
 PASS keyRange.lower is 32.5
 PASS keyRange.upper is 42.6
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(32.5) is true
+PASS keyRange.contains(42.6) is false
 IDBKeyRange.bound(33.7,43.8, true, false)
 PASS keyRange.lower is 33.7
 PASS keyRange.upper is 43.8
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is false
+PASS keyRange.contains(33.7) is false
+PASS keyRange.contains(43.8) is true
 IDBKeyRange.bound(34.9,44, true, true)
 PASS keyRange.lower is 34.9
 PASS keyRange.upper is 44
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is true
+PASS keyRange.contains(34.9) is false
+PASS keyRange.contains(44) is false
 IDBKeyRange.bound('aaa','aba', false, false)
 PASS keyRange.lower is 'aaa'
 PASS keyRange.upper is 'aba'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aaa') is true
+PASS keyRange.contains('aba') is true
 IDBKeyRange.bound('aab','abb', undefined, undefined)
 PASS keyRange.lower is 'aab'
 PASS keyRange.upper is 'abb'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aab') is true
+PASS keyRange.contains('abb') is true
 IDBKeyRange.bound('aac','abc', false, false)
 PASS keyRange.lower is 'aac'
 PASS keyRange.upper is 'abc'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aac') is true
+PASS keyRange.contains('abc') is true
 IDBKeyRange.bound('aad','abd', false, true)
 PASS keyRange.lower is 'aad'
 PASS keyRange.upper is 'abd'
 PASS keyRange.lowerOpen is false
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('aad') is true
+PASS keyRange.contains('abd') is false
 IDBKeyRange.bound('aae','abe', true, false)
 PASS keyRange.lower is 'aae'
 PASS keyRange.upper is 'abe'
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is false
+PASS keyRange.contains('aae') is false
+PASS keyRange.contains('abe') is true
 IDBKeyRange.bound('aaf','abf', true, true)
 PASS keyRange.lower is 'aaf'
 PASS keyRange.upper is 'abf'
 PASS keyRange.lowerOpen is true
 PASS keyRange.upperOpen is true
+PASS keyRange.contains('aaf') is false
+PASS keyRange.contains('abf') is false
 Passing an invalid key into only({})
 Expecting exception from IDBKeyRange.only({})
 PASS Exception was thrown.
@@ -270,6 +367,12 @@ PASS code is 0
 PASS ename is 'DataError'
 Exception message: The data provided does not meet requirements.
 Equal keys, none of the bounds is open, bound(4, 4, false, false)
+Passing an invalid key in to IDBKeyRange.contains({})
+Expecting exception from invalidKeyKeyRange.contains({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'contains' on 'IDBKeyRange': The passed-in value is not a valid IndexedDB key.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 8a2ebf0..eb08279 100644 (file)
@@ -5,6 +5,38 @@ if (this.importScripts) {
 
 description("Test IndexedDB's KeyRange.");
 
+function incrementedKey(key)
+{
+    if (typeof key == "number")
+        return key + 0.1;
+    if (typeof key == "string") {
+        if (key.length < 2)
+            testFailed("String key is too short: " + key);
+        if (key.charAt(key.length - 1) != "'")
+            testFailed("Completely unexpected string key: " + key);
+        
+        return key.substring(0, key.length - 1) + key.charAt(key.length - 2) + "'";
+    }
+    
+    testFailed("Incrementing unexpected key type: " + typeof key);
+}
+
+function decrementedKey(key)
+{
+    if (typeof key == "number")
+        return key - 0.1;
+    if (typeof key == "string") {
+        if (key.length < 3)
+            testFailed("String key is too short: " + key);
+        if (key.charAt(key.length - 1) != "'")
+            testFailed("Completely unexpected string key: " + key);
+        
+        return key.substring(0, key.length - 2) + "'";
+    }
+    
+    testFailed("Decrementing unexpected key type: " + typeof key);
+}
+
 function checkSingleKeyRange(value)
 {
     keyRange = evalAndLog("IDBKeyRange.only(" + value + ")");
@@ -12,6 +44,9 @@ function checkSingleKeyRange(value)
     shouldBe("keyRange.upper", "" + value);
     shouldBeFalse("keyRange.lowerOpen");
     shouldBeFalse("keyRange.upperOpen");
+    shouldBeFalse("keyRange.contains(" + incrementedKey(value) + ")");
+    shouldBeFalse("keyRange.contains(" + decrementedKey(value) + ")");
+    shouldBeTrue("keyRange.contains(" + value + ")");
 }
 
 function checkLowerBoundKeyRange(value, open)
@@ -23,6 +58,14 @@ function checkLowerBoundKeyRange(value, open)
     shouldBe("keyRange.lowerOpen", "" + open);
     shouldBeUndefined("keyRange.upper");
     shouldBeTrue("keyRange.upperOpen");
+
+    if (open)
+        shouldBeFalse("keyRange.contains(" + value + ")");
+    else
+        shouldBeTrue("keyRange.contains(" + value + ")");
+
+    shouldBeTrue("keyRange.contains(" + incrementedKey(value) + ")");
+    shouldBeFalse("keyRange.contains(" + decrementedKey(value) + ")");
 }
 
 function checkUpperBoundKeyRange(value, open)
@@ -34,6 +77,14 @@ function checkUpperBoundKeyRange(value, open)
     shouldBe("keyRange.upperOpen", "" + open);
     shouldBeUndefined("keyRange.lower");
     shouldBeTrue("keyRange.lowerOpen");
+
+    if (open)
+        shouldBeFalse("keyRange.contains(" + value + ")");
+    else
+        shouldBeTrue("keyRange.contains(" + value + ")");
+
+    shouldBeFalse("keyRange.contains(" + incrementedKey(value) + ")");
+    shouldBeTrue("keyRange.contains(" + decrementedKey(value) + ")");
 }
 
 function checkBoundKeyRange(lower, upper, lowerOpen, upperOpen)
@@ -47,6 +98,16 @@ function checkBoundKeyRange(lower, upper, lowerOpen, upperOpen)
         upperOpen = false;
     shouldBe("keyRange.lowerOpen", "" + lowerOpen);
     shouldBe("keyRange.upperOpen", "" + upperOpen);
+    
+    if (lowerOpen)
+        shouldBeFalse("keyRange.contains(" + lower + ")");
+    else
+        shouldBeTrue("keyRange.contains(" + lower + ")");
+
+    if (upperOpen)
+        shouldBeFalse("keyRange.contains(" + upper + ")");
+    else
+        shouldBeTrue("keyRange.contains(" + upper + ")");
 }
 
 function test()
@@ -56,6 +117,7 @@ function test()
     shouldBeFalse("'upper' in IDBKeyRange");
     shouldBeFalse("'lowerOpen' in IDBKeyRange");
     shouldBeFalse("'upperOpen' in IDBKeyRange");
+    shouldBeFalse("'contains' in IDBKeyRange");
     shouldBeTrue("'only' in IDBKeyRange");
     shouldBeTrue("'lowerBound' in IDBKeyRange");
     shouldBeTrue("'upperBound' in IDBKeyRange");
@@ -68,6 +130,7 @@ function test()
     shouldBeTrue("'upper' in instance");
     shouldBeTrue("'lowerOpen' in instance");
     shouldBeTrue("'upperOpen' in instance");
+    shouldBeTrue("'contains' in instance");
     shouldBeFalse("'only' in instance");
     shouldBeFalse("'lowerBound' in instance");
     shouldBeFalse("'upperBound' in instance");
@@ -150,6 +213,10 @@ function test()
 
     debug("Equal keys, none of the bounds is open, bound(4, 4, false, false)");
     IDBKeyRange.bound(4, 4, false, false);
+
+    debug("Passing an invalid key in to IDBKeyRange.contains({})");
+    eval("invalidKeyKeyRange = IDBKeyRange.only('a')");
+    evalAndExpectException("invalidKeyKeyRange.contains({})", "0", "'DataError'");
 }
 
 test();
index b6d69c5..573383f 100644 (file)
@@ -1,3 +1,19 @@
+2016-10-24  Brady Eidson  <beidson@apple.com>
+
+        IndexedDB 2.0: Support new IDBKeyRange interfaces.
+        <rdar://problem/28806929> and https://bugs.webkit.org/show_bug.cgi?id=163910
+
+        Reviewed by Andy Estes.
+
+        No new tests (Covered by additions to existing test)
+
+        The "new IDBKeyRanges interfaces" really just means adding the instance method IDBKeyRange.contains.
+
+        * Modules/indexeddb/IDBKeyRange.cpp:
+        (WebCore::IDBKeyRange::contains):
+        * Modules/indexeddb/IDBKeyRange.h:
+        * Modules/indexeddb/IDBKeyRange.idl:
+
 2016-10-23  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [DOMJIT] Add a way for DOMJIT::Patchpoint to express effects
index 2a5979a..062e977 100644 (file)
@@ -113,6 +113,33 @@ bool IDBKeyRange::isOnlyKey() const
     return m_lower && m_upper && !m_isLowerOpen && !m_isUpperOpen && m_lower->isEqual(*m_upper);
 }
 
+ExceptionOr<bool> IDBKeyRange::contains(JSC::ExecState& state, JSC::JSValue keyValue)
+{
+    auto key = scriptValueToIDBKey(state, keyValue);
+    if (!key->isValid())
+        return Exception { IDBDatabaseException::DataError, "Failed to execute 'contains' on 'IDBKeyRange': The passed-in value is not a valid IndexedDB key." };
+
+    if (m_lower) {
+        int compare = m_lower->compare(key.get());
+
+        if (compare > 0)
+            return false;
+        if (m_isLowerOpen && !compare)
+            return false;
+    }
+
+    if (m_upper) {
+        int compare = m_upper->compare(key.get());
+
+        if (compare < 0)
+            return false;
+        if (m_isUpperOpen && !compare)
+            return false;
+    }
+
+    return true;
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(INDEXED_DATABASE)
index 10242de..19af084 100644 (file)
@@ -63,6 +63,8 @@ public:
 
     static ExceptionOr<Ref<IDBKeyRange>> bound(JSC::ExecState&, JSC::JSValue lower, JSC::JSValue upper, bool lowerOpen, bool upperOpen);
 
+    ExceptionOr<bool> contains(JSC::ExecState&, JSC::JSValue key);
+
     WEBCORE_EXPORT bool isOnlyKey() const;
 
 private:
index 5b6fa57..13d11c0 100644 (file)
@@ -37,4 +37,6 @@
     [CallWith=ScriptState, MayThrowException] static IDBKeyRange lowerBound(any lower, optional boolean open = false);
     [CallWith=ScriptState, MayThrowException] static IDBKeyRange upperBound(any upper, optional boolean open = false);
     [CallWith=ScriptState, MayThrowException] static IDBKeyRange bound(any lower, any upper, optional boolean lowerOpen = false, optional boolean upperOpen = false);
+
+    [CallWith=ScriptState, MayThrowException] boolean contains(any key);
 };