PassRefPtr<Database> DatabaseManager::openDatabase(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, DatabaseError& error) { ScriptController::initializeThreading(); ASSERT(error == DatabaseError::None); bool setVersionInNewDatabase = !creationCallback; String errorMessage; RefPtr<DatabaseBackendBase> backend = openDatabaseBackend(context, DatabaseType::Async, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, error, errorMessage); if (!backend) return 0; RefPtr<Database> database = Database::create(context, backend); RefPtr<DatabaseContext> databaseContext = databaseContextFor(context); databaseContext->setHasOpenDatabases(); InspectorInstrumentation::didOpenDatabase(context, database, context->securityOrigin()->host(), name, expectedVersion); if (backend->isNew() && creationCallback.get()) { LOG(StorageAPI, "Scheduling DatabaseCreationCallbackTask for database %p\n", database.get()); database->m_scriptExecutionContext->postTask([creationCallback, database] (ScriptExecutionContext&) { creationCallback->handleEvent(database.get()); }); } ASSERT(database); return database.release(); }
ExceptionOr<Ref<Database>> DatabaseManager::openDatabase(ScriptExecutionContext& context, const String& name, const String& expectedVersion, const String& displayName, unsigned estimatedSize, RefPtr<DatabaseCallback>&& creationCallback) { ScriptController::initializeThreading(); bool setVersionInNewDatabase = !creationCallback; auto openResult = openDatabaseBackend(context, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase); if (openResult.hasException()) return openResult.releaseException(); RefPtr<Database> database = openResult.releaseReturnValue(); auto databaseContext = this->databaseContext(context); databaseContext->setHasOpenDatabases(); InspectorInstrumentation::didOpenDatabase(&context, database.copyRef(), context.securityOrigin()->host(), name, expectedVersion); if (database->isNew() && creationCallback.get()) { LOG(StorageAPI, "Scheduling DatabaseCreationCallbackTask for database %p\n", database.get()); database->setHasPendingCreationEvent(true); database->m_scriptExecutionContext->postTask([creationCallback, database] (ScriptExecutionContext&) { creationCallback->handleEvent(database.get()); database->setHasPendingCreationEvent(false); }); } return database.releaseNonNull(); }
PassRefPtr<DatabaseSync> DatabaseManager::openDatabaseSync(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, DatabaseError& error) { ASSERT(context->isContextThread()); ASSERT(error == DatabaseError::None); bool setVersionInNewDatabase = !creationCallback; String errorMessage; RefPtr<DatabaseBackendBase> backend = openDatabaseBackend(context, DatabaseType::Sync, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, error, errorMessage); if (!backend) return 0; RefPtr<DatabaseSync> database = DatabaseSync::create(context, backend); if (backend->isNew() && creationCallback.get()) { LOG(StorageAPI, "Invoking the creation callback for database %p\n", database.get()); creationCallback->handleEvent(database.get()); } ASSERT(database); return database.release(); }