Modern IDB: Possible crash deallocating IDBDatabaseInfo/IDBObjectStoreInfo/IDBIndexInfo.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / shared / IDBDatabaseInfo.cpp
index cb169f0..23ce920 100644 (file)
@@ -40,14 +40,18 @@ IDBDatabaseInfo::IDBDatabaseInfo(const String& name, uint64_t version)
 {
 }
 
-IDBDatabaseInfo IDBDatabaseInfo::isolatedCopy() const
+IDBDatabaseInfo::IDBDatabaseInfo(const IDBDatabaseInfo& other, IsolatedCopyTag)
+    : m_name(other.m_name.isolatedCopy())
+    , m_version(other.m_version)
+    , m_maxObjectStoreID(other.m_maxObjectStoreID)
 {
-    IDBDatabaseInfo info;
-
-    info.m_name = m_name.isolatedCopy();
-    info.m_version = m_version;
+    for (auto entry : other.m_objectStoreMap)
+        m_objectStoreMap.set(entry.key, entry.value.isolatedCopy());
+}
 
-    return WTF::move(info);
+IDBDatabaseInfo IDBDatabaseInfo::isolatedCopy() const
+{
+    return { *this, IDBDatabaseInfo::IsolatedCopy };
 }
 
 bool IDBDatabaseInfo::hasObjectStore(const String& name) const
@@ -123,7 +127,7 @@ Vector<String> IDBDatabaseInfo::objectStoreNames() const
     for (auto& objectStore : m_objectStoreMap.values())
         names.uncheckedAppend(objectStore.name());
 
-    return WTF::move(names);
+    return names;
 }
 
 void IDBDatabaseInfo::deleteObjectStore(const String& objectStoreName)
@@ -135,6 +139,22 @@ void IDBDatabaseInfo::deleteObjectStore(const String& objectStoreName)
     m_objectStoreMap.remove(info->identifier());
 }
 
+void IDBDatabaseInfo::deleteObjectStore(uint64_t objectStoreIdentifier)
+{
+    m_objectStoreMap.remove(objectStoreIdentifier);
+}
+
+#ifndef NDEBUG
+String IDBDatabaseInfo::loggingString() const
+{
+    String top = makeString("Database: ", m_name, " version ", String::number(m_version), "\n");
+    for (auto objectStore : m_objectStoreMap.values())
+        top.append(makeString(objectStore.loggingString(1), "\n"));
+
+    return top; 
+}
+#endif
+
 } // namespace WebCore
 
 #endif // ENABLE(INDEXED_DATABASE)