void WebIDBFactoryBackend::open(const String& databaseName, uint64_t version, int64_t transactionId, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks, const SecurityOrigin& openingOrigin, const SecurityOrigin& mainFrameOrigin) { ASSERT(RunLoop::isMain()); LOG(IDB, "WebIDBFactoryBackend::open"); String databaseIdentifier = uniqueDatabaseIdentifier(databaseName, openingOrigin, mainFrameOrigin); if (databaseIdentifier.isNull()) { callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::InvalidAccessError, "Document is not allowed to use Indexed Databases")); return; } String securityOriginIdentifier = combinedSecurityOriginIdentifier(openingOrigin, mainFrameOrigin); ASSERT(!securityOriginIdentifier.isEmpty()); auto recentNameIterator = sharedRecentDatabaseNameMap().find(securityOriginIdentifier); if (recentNameIterator == sharedRecentDatabaseNameMap().end()) { HashSet<String> names; names.add(databaseName); sharedRecentDatabaseNameMap().set(securityOriginIdentifier, names); } else recentNameIterator->value.add(databaseName); IDBDatabaseBackendMap::iterator it = sharedDatabaseBackendMap().find(databaseIdentifier); RefPtr<IDBDatabaseBackend> databaseBackend; if (it == sharedDatabaseBackendMap().end()) { RefPtr<IDBServerConnection> serverConnection = WebIDBServerConnection::create(databaseName, openingOrigin, mainFrameOrigin); databaseBackend = IDBDatabaseBackend::create(databaseName, databaseIdentifier, this, *serverConnection); sharedDatabaseBackendMap().set(databaseIdentifier, databaseBackend.get()); } else databaseBackend = it->value; databaseBackend->openConnection(callbacks, databaseCallbacks, transactionId, version); }
void WebIDBFactoryBackend::deleteDatabase(const String& databaseName, const SecurityOrigin& openingOrigin, const SecurityOrigin& mainFrameOrigin, PassRefPtr<IDBCallbacks> callbacks, ScriptExecutionContext*, const String&) { ASSERT(RunLoop::isMain()); LOG(IDB, "WebIDBFactoryBackend::deleteDatabase"); String databaseIdentifier = uniqueDatabaseIdentifier(databaseName, openingOrigin, mainFrameOrigin); if (databaseIdentifier.isNull()) { callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::InvalidAccessError, "Document is not allowed to use Indexed Databases")); return; } String securityOriginIdentifier = combinedSecurityOriginIdentifier(openingOrigin, mainFrameOrigin); ASSERT(!securityOriginIdentifier.isEmpty()); auto recentNameIterator = sharedRecentDatabaseNameMap().find(securityOriginIdentifier); if (recentNameIterator != sharedRecentDatabaseNameMap().end()) { recentNameIterator->value.remove(databaseName); if (recentNameIterator->value.isEmpty()) sharedRecentDatabaseNameMap().remove(recentNameIterator); } // If there's already a connection to the database, delete it directly. IDBDatabaseBackendMap::iterator it = sharedDatabaseBackendMap().find(databaseIdentifier); if (it != sharedDatabaseBackendMap().end()) { it->value->deleteDatabase(callbacks); return; } RefPtr<IDBServerConnection> serverConnection = WebIDBServerConnection::create(databaseName, openingOrigin, mainFrameOrigin); RefPtr<IDBDatabaseBackend> databaseBackend = IDBDatabaseBackend::create(databaseName, databaseIdentifier, this, *serverConnection); sharedDatabaseBackendMap().set(databaseIdentifier, databaseBackend.get()); databaseBackend->deleteDatabase(callbacks); sharedDatabaseBackendMap().remove(databaseIdentifier); }
void WebIDBFactoryBackend::open(const String& databaseName, uint64_t version, int64_t transactionId, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks, const SecurityOrigin& openingOrigin, const SecurityOrigin& mainFrameOrigin) { ASSERT(isMainThread()); LOG(StorageAPI, "WebIDBFactoryBackend::open"); String databaseIdentifier = uniqueDatabaseIdentifier(databaseName, openingOrigin, mainFrameOrigin); if (databaseIdentifier.isNull()) { callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::InvalidAccessError, "Document is not allowed to use Indexed Databases")); return; } IDBDatabaseBackendMap::iterator it = sharedDatabaseBackendMap().find(databaseIdentifier); RefPtr<IDBDatabaseBackend> databaseBackend; if (it == sharedDatabaseBackendMap().end()) { RefPtr<IDBServerConnection> serverConnection = WebIDBServerConnection::create(databaseName, openingOrigin, mainFrameOrigin); databaseBackend = IDBDatabaseBackend::create(databaseName, databaseIdentifier, this, *serverConnection); sharedDatabaseBackendMap().set(databaseIdentifier, databaseBackend.get()); } else databaseBackend = it->value; databaseBackend->openConnection(callbacks, databaseCallbacks, transactionId, version); }