[IndexedDB] array index keys are concatenated across cursor lifetime
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Jun 2015 20:24:55 +0000 (20:24 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Jun 2015 20:24:55 +0000 (20:24 +0000)
<rdar://problem/19684902> and https://bugs.webkit.org/show_bug.cgi?id=138504

Reviewed by Brady Eidson, patch by Mark Dixon <mark@lowla.io>

Source/WebCore:

Tested by:
storage/indexeddb/keypath-arrays.html

IDBKeyData and IDBKeyPath need to clear any existing array values before calling
decodeObjects to update the value of an existing object.

* Modules/indexeddb/IDBKeyData.cpp:
(WebCore::IDBKeyData::decode):
* Modules/indexeddb/IDBKeyPath.cpp:
(WebCore::IDBKeyPath::decode):

LayoutTests:

* storage/indexeddb/keypath-arrays-expected.txt:
* storage/indexeddb/resources/keypath-arrays.js:
Verify that iterating cursors with array keypaths returns correct keys for all
records, not just the first.

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

LayoutTests/ChangeLog
LayoutTests/storage/indexeddb/keypath-arrays-expected.txt
LayoutTests/storage/indexeddb/resources/keypath-arrays.js
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBKeyData.cpp
Source/WebCore/Modules/indexeddb/IDBKeyPath.cpp

index 5c3ba9b..1a730d7 100644 (file)
@@ -1,3 +1,15 @@
+2015-06-16  Brady Eidson  <beidson@apple.com>
+
+        [IndexedDB] array index keys are concatenated across cursor lifetime
+        <rdar://problem/19684902> and https://bugs.webkit.org/show_bug.cgi?id=138504
+
+        Reviewed by Brady Eidson, patch by Mark Dixon <mark@lowla.io>
+
+        * storage/indexeddb/keypath-arrays-expected.txt:
+        * storage/indexeddb/resources/keypath-arrays.js:
+        Verify that iterating cursors with array keypaths returns correct keys for all
+        records, not just the first.
+
 2015-06-16  Said Abou-Hallawa  <sabouhallawa@apple.com>
 
         Canvas dimensions should be limited to 4096x4096 pixels on iOS devices.
index e10b342..1247cc3 100644 (file)
@@ -35,15 +35,23 @@ store = transaction.objectStore('store')
 index = store.index('index')
 
 request = store.put({a: 1, b: 2, c: 3, d: 4})
+request = store.put({a: 5, b: 6, c: 7, d: 8})
 request = store.openCursor()
 cursor = request.result
 PASS cursor is non-null.
 PASS JSON.stringify(cursor.key) is "[1,2]"
+cursor = request.result
+PASS cursor is non-null.
+PASS JSON.stringify(cursor.key) is "[5,6]"
 request = index.openCursor()
 cursor = request.result
 PASS cursor is non-null.
 PASS JSON.stringify(cursor.primaryKey) is "[1,2]"
 PASS JSON.stringify(cursor.key) is "[3,4]"
+cursor = request.result
+PASS cursor is non-null.
+PASS JSON.stringify(cursor.primaryKey) is "[5,6]"
+PASS JSON.stringify(cursor.key) is "[7,8]"
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 7ddca64..2c466cb 100644 (file)
@@ -35,6 +35,9 @@ function testKeyPaths()
     debug("");
     evalAndLog("request = store.put({a: 1, b: 2, c: 3, d: 4})");
     request.onerror = unexpectedErrorCallback;
+    evalAndLog("request = store.put({a: 5, b: 6, c: 7, d: 8})");
+    request.onerror = unexpectedErrorCallback;
+    iteration = 0;
     checkStore();
 
     function checkStore() {
@@ -43,8 +46,15 @@ function testKeyPaths()
         request.onsuccess = function () {
             evalAndLog("cursor = request.result");
             shouldBeNonNull("cursor");
-            shouldBeEqualToString("JSON.stringify(cursor.key)", "[1,2]");
-            checkIndex();
+            shouldBeEqualToString("JSON.stringify(cursor.key)", ["[1,2]", "[5,6]"][iteration]);
+            if (0 === iteration) {
+              ++iteration;
+              cursor.continue();
+            }
+            else {
+              iteration = 0;
+              checkIndex();
+            }
         };
     };
 
@@ -54,8 +64,12 @@ function testKeyPaths()
         request.onsuccess = function () {
             evalAndLog("cursor = request.result");
             shouldBeNonNull("cursor");
-            shouldBeEqualToString("JSON.stringify(cursor.primaryKey)", "[1,2]");
-            shouldBeEqualToString("JSON.stringify(cursor.key)", "[3,4]");
+            shouldBeEqualToString("JSON.stringify(cursor.primaryKey)", ["[1,2]", "[5,6]"][iteration]);
+            shouldBeEqualToString("JSON.stringify(cursor.key)", ["[3,4]", "[7,8]"][iteration]);
+            if (0 === iteration) {
+              ++iteration;
+              cursor.continue();
+            }
         };
     };
 
index a7f19f4..6c1a508 100644 (file)
@@ -1,3 +1,21 @@
+2015-06-16  Brady Eidson  <beidson@apple.com>
+
+        [IndexedDB] array index keys are concatenated across cursor lifetime
+        <rdar://problem/19684902> and https://bugs.webkit.org/show_bug.cgi?id=138504
+
+        Reviewed by Brady Eidson, patch by Mark Dixon <mark@lowla.io>
+
+        Tested by:
+        storage/indexeddb/keypath-arrays.html
+
+        IDBKeyData and IDBKeyPath need to clear any existing array values before calling
+        decodeObjects to update the value of an existing object.
+        
+        * Modules/indexeddb/IDBKeyData.cpp:
+        (WebCore::IDBKeyData::decode):
+        * Modules/indexeddb/IDBKeyPath.cpp:
+        (WebCore::IDBKeyPath::decode):
+
 2015-06-16  Said Abou-Hallawa  <sabouhallawa@apple.com>
 
         Canvas dimensions should be limited to 4096x4096 pixels on iOS devices.
index 044b147..2f2b4f6 100644 (file)
@@ -201,6 +201,8 @@ bool IDBKeyData::decode(KeyedDecoder& decoder, IDBKeyData& result)
     auto arrayFunction = [](KeyedDecoder& decoder, IDBKeyData& result) {
         return decode(decoder, result);
     };
+    
+    result.arrayValue.clear();
     return decoder.decodeObjects("array", result.arrayValue, arrayFunction);
 }
 
index 65ac3c5..112b001 100644 (file)
@@ -300,6 +300,7 @@ bool IDBKeyPath::decode(KeyedDecoder& decoder, IDBKeyPath& result)
         return decoder.decodeString("string", result);
     };
 
+    result.m_array.clear();
     return decoder.decodeObjects("array", result.m_array, arrayFunction);
 }