diff options
Diffstat (limited to 'Source/WebCore/Modules/indexeddb/server/IDBServer.h')
-rw-r--r-- | Source/WebCore/Modules/indexeddb/server/IDBServer.h | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/Source/WebCore/Modules/indexeddb/server/IDBServer.h b/Source/WebCore/Modules/indexeddb/server/IDBServer.h new file mode 100644 index 000000000..256cd507e --- /dev/null +++ b/Source/WebCore/Modules/indexeddb/server/IDBServer.h @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2015, 2016 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBConnectionToClient.h" +#include "IDBDatabaseIdentifier.h" +#include "UniqueIDBDatabase.h" +#include "UniqueIDBDatabaseConnection.h" +#include <wtf/CrossThreadQueue.h> +#include <wtf/CrossThreadTask.h> +#include <wtf/HashMap.h> +#include <wtf/Lock.h> +#include <wtf/Ref.h> +#include <wtf/RefCounted.h> +#include <wtf/RefPtr.h> + +namespace WebCore { + +class IDBCursorInfo; +class IDBRequestData; +class IDBValue; + +struct IDBGetRecordData; + +namespace IDBServer { + +class IDBBackingStoreTemporaryFileHandler; + +class IDBServer : public RefCounted<IDBServer> { +public: + static Ref<IDBServer> create(IDBBackingStoreTemporaryFileHandler&); + WEBCORE_EXPORT static Ref<IDBServer> create(const String& databaseDirectoryPath, IDBBackingStoreTemporaryFileHandler&); + + WEBCORE_EXPORT void registerConnection(IDBConnectionToClient&); + WEBCORE_EXPORT void unregisterConnection(IDBConnectionToClient&); + + // Operations requested by the client. + WEBCORE_EXPORT void openDatabase(const IDBRequestData&); + WEBCORE_EXPORT void deleteDatabase(const IDBRequestData&); + WEBCORE_EXPORT void abortTransaction(const IDBResourceIdentifier&); + WEBCORE_EXPORT void commitTransaction(const IDBResourceIdentifier&); + WEBCORE_EXPORT void didFinishHandlingVersionChangeTransaction(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier&); + WEBCORE_EXPORT void createObjectStore(const IDBRequestData&, const IDBObjectStoreInfo&); + WEBCORE_EXPORT void renameObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& newName); + WEBCORE_EXPORT void deleteObjectStore(const IDBRequestData&, const String& objectStoreName); + WEBCORE_EXPORT void clearObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier); + WEBCORE_EXPORT void createIndex(const IDBRequestData&, const IDBIndexInfo&); + WEBCORE_EXPORT void deleteIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName); + WEBCORE_EXPORT void renameIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName); + WEBCORE_EXPORT void putOrAdd(const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode); + WEBCORE_EXPORT void getRecord(const IDBRequestData&, const IDBGetRecordData&); + WEBCORE_EXPORT void getAllRecords(const IDBRequestData&, const IDBGetAllRecordsData&); + WEBCORE_EXPORT void getCount(const IDBRequestData&, const IDBKeyRangeData&); + WEBCORE_EXPORT void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&); + WEBCORE_EXPORT void openCursor(const IDBRequestData&, const IDBCursorInfo&); + WEBCORE_EXPORT void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&); + + WEBCORE_EXPORT void establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&); + WEBCORE_EXPORT void databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier); + WEBCORE_EXPORT void databaseConnectionClosed(uint64_t databaseConnectionIdentifier); + WEBCORE_EXPORT void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier); + WEBCORE_EXPORT void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier); + WEBCORE_EXPORT void openDBRequestCancelled(const IDBRequestData&); + WEBCORE_EXPORT void confirmDidCloseFromServer(uint64_t databaseConnectionIdentifier); + + WEBCORE_EXPORT void getAllDatabaseNames(uint64_t serverConnectionIdentifier, const SecurityOriginData& mainFrameOrigin, const SecurityOriginData& openingOrigin, uint64_t callbackID); + + void postDatabaseTask(CrossThreadTask&&); + void postDatabaseTaskReply(CrossThreadTask&&); + + void registerDatabaseConnection(UniqueIDBDatabaseConnection&); + void unregisterDatabaseConnection(UniqueIDBDatabaseConnection&); + void registerTransaction(UniqueIDBDatabaseTransaction&); + void unregisterTransaction(UniqueIDBDatabaseTransaction&); + + void closeUniqueIDBDatabase(UniqueIDBDatabase&); + + std::unique_ptr<IDBBackingStore> createBackingStore(const IDBDatabaseIdentifier&); + + WEBCORE_EXPORT void closeAndDeleteDatabasesModifiedSince(std::chrono::system_clock::time_point, std::function<void ()> completionHandler); + WEBCORE_EXPORT void closeAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>&, std::function<void ()> completionHandler); + +private: + IDBServer(IDBBackingStoreTemporaryFileHandler&); + IDBServer(const String& databaseDirectoryPath, IDBBackingStoreTemporaryFileHandler&); + + UniqueIDBDatabase& getOrCreateUniqueIDBDatabase(const IDBDatabaseIdentifier&); + + void performGetAllDatabaseNames(uint64_t serverConnectionIdentifier, const SecurityOriginData& mainFrameOrigin, const SecurityOriginData& openingOrigin, uint64_t callbackID); + void didGetAllDatabaseNames(uint64_t serverConnectionIdentifier, uint64_t callbackID, const Vector<String>& databaseNames); + + void performCloseAndDeleteDatabasesModifiedSince(std::chrono::system_clock::time_point, uint64_t callbackID); + void performCloseAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>&, uint64_t callbackID); + void didPerformCloseAndDeleteDatabases(uint64_t callbackID); + + static void databaseThreadEntry(void*); + void databaseRunLoop(); + void handleTaskRepliesOnMainThread(); + + HashMap<uint64_t, RefPtr<IDBConnectionToClient>> m_connectionMap; + HashMap<IDBDatabaseIdentifier, RefPtr<UniqueIDBDatabase>> m_uniqueIDBDatabaseMap; + + ThreadIdentifier m_threadID { 0 }; + Lock m_databaseThreadCreationLock; + Lock m_mainThreadReplyLock; + bool m_mainThreadReplyScheduled { false }; + + CrossThreadQueue<CrossThreadTask> m_databaseQueue; + CrossThreadQueue<CrossThreadTask> m_databaseReplyQueue; + + HashMap<uint64_t, UniqueIDBDatabaseConnection*> m_databaseConnections; + HashMap<IDBResourceIdentifier, UniqueIDBDatabaseTransaction*> m_transactions; + + HashMap<uint64_t, std::function<void ()>> m_deleteDatabaseCompletionHandlers; + + String m_databaseDirectoryPath; + IDBBackingStoreTemporaryFileHandler& m_backingStoreTemporaryFileHandler; +}; + +} // namespace IDBServer +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) |