CrashTracer: com.apple.WebKit.Storage at WebCore: WebCore::encodeKey
authorsihui_liu@apple.com <sihui_liu@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Jul 2018 00:35:02 +0000 (00:35 +0000)
committersihui_liu@apple.com <sihui_liu@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Jul 2018 00:35:02 +0000 (00:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187927
LayoutTests/imported/w3c:

<rdar://problem/42516426>

Reviewed by Chris Dumez.

* web-platform-tests/IndexedDB/key-conversion-exceptions-expected.txt:

Source/WebCore:

Reviewed by Chris Dumez.

IDBKeyData is valid only when each key of it is valid.

Test: LayoutTests/storage/indexeddb/index-multientry.html

* Modules/indexeddb/IDBKeyData.cpp:
(WebCore::IDBKeyData::isValid const):
* Modules/indexeddb/IDBKeyData.h:
(WebCore::IDBKeyData::isValid const): Deleted.

LayoutTests:

<rdar://problem/42516426>

Reviewed by Chris Dumez.

Add a new test case in existing test file to cover the crash case and update the expecation accordingly.

* storage/indexeddb/index-multientry-expected.txt:
* storage/indexeddb/index-multientry-private-expected.txt:
* storage/indexeddb/resources/index-multientry.js:
(addData):

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

LayoutTests/ChangeLog
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/IndexedDB/key-conversion-exceptions-expected.txt
LayoutTests/storage/indexeddb/index-multientry-expected.txt
LayoutTests/storage/indexeddb/index-multientry-private-expected.txt
LayoutTests/storage/indexeddb/resources/index-multientry.js
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBKeyData.cpp
Source/WebCore/Modules/indexeddb/IDBKeyData.h

index 14cd959..88161de 100644 (file)
@@ -1,3 +1,18 @@
+2018-07-23  Sihui Liu  <sihui_liu@apple.com>
+
+        CrashTracer: com.apple.WebKit.Storage at WebCore: WebCore::encodeKey
+        https://bugs.webkit.org/show_bug.cgi?id=187927
+        <rdar://problem/42516426>
+
+        Reviewed by Chris Dumez.
+
+        Add a new test case in existing test file to cover the crash case and update the expecation accordingly.
+
+        * storage/indexeddb/index-multientry-expected.txt:
+        * storage/indexeddb/index-multientry-private-expected.txt:
+        * storage/indexeddb/resources/index-multientry.js:
+        (addData):
+
 2018-07-23  Basuke Suzuki  <Basuke.Suzuki@sony.com>
 
         [Curl] Test gardening
index 5d44a4f..fd530b3 100644 (file)
@@ -1,3 +1,13 @@
+2018-07-23  Sihui Liu  <sihui_liu@apple.com>
+
+        CrashTracer: com.apple.WebKit.Storage at WebCore: WebCore::encodeKey
+        https://bugs.webkit.org/show_bug.cgi?id=187927
+        <rdar://problem/42516426>
+
+        Reviewed by Chris Dumez.
+
+        * web-platform-tests/IndexedDB/key-conversion-exceptions-expected.txt:
+
 2018-07-20  Frederic Wang  <fwang@igalia.com>
 
         Import new WPT tests for custom elements
index a4dbea7..e6c6717 100644 (file)
@@ -2,9 +2,7 @@
 FAIL IDBFactory cmp() static with throwing/invalid keys assert_throws: first key conversion with invalid key should throw DataError function "() => {
             receiver[method](invalid_key, throwing_key('getter 2'));
         }" threw object "getter 2: throwing from getter" that is not a DOMException DataError: property "code" is equal to undefined, expected 0
-FAIL IDBCursor continue() method with throwing/invalid keys assert_throws: key conversion with invalid key should throw DataError function "() => {
-            receiver[method](invalid_key);
-        }" threw object "InvalidStateError: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end." that is not a DOMException DataError: property "code" is equal to 11, expected 0
+PASS IDBCursor continue() method with throwing/invalid keys 
 PASS IndexedDB: Exceptions thrown during key conversion 
 PASS IDBCursor update() method with throwing/invalid keys 
 PASS IDBKeyRange only() static with throwing/invalid keys 
index 6fe9977..f62c903 100644 (file)
@@ -21,6 +21,7 @@ transaction.objectStore('store').put({x: [1, 2, 3], y: 'a'}, 'foo')
 transaction.objectStore('store').put({x: [4, 5, 6], y: 'b'}, 'bar')
 transaction.objectStore('store').put({x: [7, 7, 8, 7], y: 'c'}, 'baz')
 transaction.objectStore('store').put({x: [null, 9, 9], y: 'd'}, 'bloop')
+transaction.objectStore('store').put({x: [1, [2, null]], y:'e'}, 'oh')
 
 Verifying index: index
 transaction = db.transaction(['store'], 'readonly')
@@ -33,6 +34,12 @@ PASS cursor.value.y is "a"
 cursor.continue()
 cursor = event.target.result
 PASS ex is non-null.
+PASS cursor.key is 1
+PASS cursor.primaryKey is "oh"
+PASS cursor.value.y is "e"
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
 PASS cursor.key is 2
 PASS cursor.primaryKey is "foo"
 PASS cursor.value.y is "a"
@@ -84,7 +91,7 @@ PASS expected.length is 0
 transaction = db.transaction(['store'])
 transaction.objectStore('store').index('index')
 index.count()
-PASS event.target.result is 9
+PASS event.target.result is 10
 index.count(7)
 PASS event.target.result is 1
 
@@ -119,6 +126,12 @@ PASS cursor.value.y is "a"
 cursor.continue()
 cursor = event.target.result
 PASS ex is non-null.
+PASS cursor.key is 1
+PASS cursor.primaryKey is "oh"
+PASS cursor.value.y is "e"
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
 PASS cursor.key is 2
 PASS cursor.primaryKey is "foo"
 PASS cursor.value.y is "a"
@@ -170,7 +183,7 @@ PASS expected.length is 0
 transaction = db.transaction(['store'])
 transaction.objectStore('store').index('index')
 index.count()
-PASS event.target.result is 9
+PASS event.target.result is 10
 index.count(7)
 PASS event.target.result is 1
 PASS successfullyParsed is true
index 6fe9977..f62c903 100644 (file)
@@ -21,6 +21,7 @@ transaction.objectStore('store').put({x: [1, 2, 3], y: 'a'}, 'foo')
 transaction.objectStore('store').put({x: [4, 5, 6], y: 'b'}, 'bar')
 transaction.objectStore('store').put({x: [7, 7, 8, 7], y: 'c'}, 'baz')
 transaction.objectStore('store').put({x: [null, 9, 9], y: 'd'}, 'bloop')
+transaction.objectStore('store').put({x: [1, [2, null]], y:'e'}, 'oh')
 
 Verifying index: index
 transaction = db.transaction(['store'], 'readonly')
@@ -33,6 +34,12 @@ PASS cursor.value.y is "a"
 cursor.continue()
 cursor = event.target.result
 PASS ex is non-null.
+PASS cursor.key is 1
+PASS cursor.primaryKey is "oh"
+PASS cursor.value.y is "e"
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
 PASS cursor.key is 2
 PASS cursor.primaryKey is "foo"
 PASS cursor.value.y is "a"
@@ -84,7 +91,7 @@ PASS expected.length is 0
 transaction = db.transaction(['store'])
 transaction.objectStore('store').index('index')
 index.count()
-PASS event.target.result is 9
+PASS event.target.result is 10
 index.count(7)
 PASS event.target.result is 1
 
@@ -119,6 +126,12 @@ PASS cursor.value.y is "a"
 cursor.continue()
 cursor = event.target.result
 PASS ex is non-null.
+PASS cursor.key is 1
+PASS cursor.primaryKey is "oh"
+PASS cursor.value.y is "e"
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
 PASS cursor.key is 2
 PASS cursor.primaryKey is "foo"
 PASS cursor.value.y is "a"
@@ -170,7 +183,7 @@ PASS expected.length is 0
 transaction = db.transaction(['store'])
 transaction.objectStore('store').index('index')
 index.count()
-PASS event.target.result is 9
+PASS event.target.result is 10
 index.count(7)
 PASS event.target.result is 1
 PASS successfullyParsed is true
index 71b96a8..957bb4c 100644 (file)
@@ -37,6 +37,7 @@ function addData()
     request.onerror = unexpectedErrorCallback;
     request = evalAndLog("transaction.objectStore('store').put({x: [null, 9, 9], y: 'd'}, 'bloop')");
     request.onerror = unexpectedErrorCallback;
+    request = evalAndLog("transaction.objectStore('store').put({x: [1, [2, null]], y:'e'}, 'oh')");
 }
 
 function verifyIndexes(indexName, callback)
@@ -49,6 +50,7 @@ function verifyIndexes(indexName, callback)
 
     expected = [
         { key: 1, primaryKey: 'foo', y: 'a' },
+        { key: 1, primaryKey: 'oh', y: 'e' },
         { key: 2, primaryKey: 'foo', y: 'a' },
         { key: 3, primaryKey: 'foo', y: 'a' },
         { key: 4, primaryKey: 'bar', y: 'b' },
@@ -114,7 +116,7 @@ function verifyCount(callback) {
     request = evalAndLog("index.count()");
     request.onsuccess = function(event) {
 
-        shouldBe("event.target.result", "9");
+        shouldBe("event.target.result", "10");
 
         request = evalAndLog("index.count(7)");
         request.onsuccess = function(event) {
index 6beb0bd..bfc9914 100644 (file)
@@ -1,3 +1,19 @@
+2018-07-23  Sihui Liu  <sihui_liu@apple.com>
+
+        CrashTracer: com.apple.WebKit.Storage at WebCore: WebCore::encodeKey
+        https://bugs.webkit.org/show_bug.cgi?id=187927
+
+        Reviewed by Chris Dumez.
+
+        IDBKeyData is valid only when each key of it is valid.
+
+        Test: LayoutTests/storage/indexeddb/index-multientry.html
+
+        * Modules/indexeddb/IDBKeyData.cpp:
+        (WebCore::IDBKeyData::isValid const):
+        * Modules/indexeddb/IDBKeyData.h:
+        (WebCore::IDBKeyData::isValid const): Deleted.
+
 2018-07-23  Ben Richards  <benton_richards@apple.com>
 
         We should cache the compiled sandbox profile in a data vault
index 575d47d..2e8cedc 100644 (file)
@@ -426,6 +426,21 @@ IDBKeyData IDBKeyData::deletedValue()
     return result;
 }
 
+bool IDBKeyData::isValid() const
+{
+    if (m_type == KeyType::Invalid)
+        return false;
+    
+    if (m_type == KeyType::Array) {
+        for (auto& key : array()) {
+            if (!key.isValid())
+                return false;
+        }
+    }
+
+    return true;
+}
+
 bool IDBKeyData::operator<(const IDBKeyData& rhs) const
 {
     return compare(rhs) < 0;
index 67f32e9..abd9d06 100644 (file)
@@ -93,7 +93,7 @@ public:
 #endif
 
     bool isNull() const { return m_isNull; }
-    bool isValid() const { return m_type != KeyType::Invalid; }
+    bool isValid() const;
     KeyType type() const { return m_type; }
 
     bool operator<(const IDBKeyData&) const;