Modern IDB: Possible crash deallocating IDBDatabaseInfo/IDBObjectStoreInfo/IDBIndexInfo.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / shared / IDBDatabaseInfo.cpp
index 89b0dde..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
@@ -77,7 +81,7 @@ void IDBDatabaseInfo::addExistingObjectStore(const IDBObjectStoreInfo& info)
     m_objectStoreMap.set(info.identifier(), info);
 }
 
-const IDBObjectStoreInfo* IDBDatabaseInfo::infoForExistingObjectStore(uint64_t objectStoreIdentifier) const
+IDBObjectStoreInfo* IDBDatabaseInfo::getInfoForExistingObjectStore(uint64_t objectStoreIdentifier)
 {
     auto iterator = m_objectStoreMap.find(objectStoreIdentifier);
     if (iterator == m_objectStoreMap.end())
@@ -86,7 +90,7 @@ const IDBObjectStoreInfo* IDBDatabaseInfo::infoForExistingObjectStore(uint64_t o
     return &iterator->value;
 }
 
-const IDBObjectStoreInfo* IDBDatabaseInfo::infoForExistingObjectStore(const String& name) const
+IDBObjectStoreInfo* IDBDatabaseInfo::getInfoForExistingObjectStore(const String& name)
 {
     for (auto& objectStore : m_objectStoreMap.values()) {
         if (objectStore.name() == name)
@@ -96,6 +100,26 @@ const IDBObjectStoreInfo* IDBDatabaseInfo::infoForExistingObjectStore(const Stri
     return nullptr;
 }
 
+const IDBObjectStoreInfo* IDBDatabaseInfo::infoForExistingObjectStore(uint64_t objectStoreIdentifier) const
+{
+    return const_cast<IDBDatabaseInfo*>(this)->getInfoForExistingObjectStore(objectStoreIdentifier);
+}
+
+IDBObjectStoreInfo* IDBDatabaseInfo::infoForExistingObjectStore(uint64_t objectStoreIdentifier)
+{
+    return getInfoForExistingObjectStore(objectStoreIdentifier);
+}
+
+const IDBObjectStoreInfo* IDBDatabaseInfo::infoForExistingObjectStore(const String& name) const
+{
+    return const_cast<IDBDatabaseInfo*>(this)->getInfoForExistingObjectStore(name);
+}
+
+IDBObjectStoreInfo* IDBDatabaseInfo::infoForExistingObjectStore(const String& name)
+{
+    return getInfoForExistingObjectStore(name);
+}
+
 Vector<String> IDBDatabaseInfo::objectStoreNames() const
 {
     Vector<String> names;
@@ -103,8 +127,33 @@ 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)
+{
+    auto* info = infoForExistingObjectStore(objectStoreName);
+    if (!info)
+        return;
+
+    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