コード例 #1
0
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);
}
コード例 #2
0
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);
}
コード例 #3
0
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);
}