/* * Copyright (C) 2013 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. */ #ifndef StorageManager_h #define StorageManager_h #include "Connection.h" #include "LocalStorageDatabaseTracker.h" #include #include #include #include #include #include namespace WebCore { class SecurityOrigin; struct SecurityOriginData; } namespace WebKit { class LocalStorageDatabaseTracker; class WebProcessProxy; class StorageManager : public IPC::Connection::WorkQueueMessageReceiver { public: static Ref create(const String& localStorageDirectory); ~StorageManager(); void createSessionStorageNamespace(uint64_t storageNamespaceID, unsigned quotaInBytes); void destroySessionStorageNamespace(uint64_t storageNamespaceID); void setAllowedSessionStorageNamespaceConnection(uint64_t storageNamespaceID, IPC::Connection* allowedConnection); void cloneSessionStorageNamespace(uint64_t storageNamespaceID, uint64_t newStorageNamespaceID); void processWillOpenConnection(WebProcessProxy&, IPC::Connection&); void processDidCloseConnection(WebProcessProxy&, IPC::Connection&); void applicationWillTerminate(); void getSessionStorageOrigins(std::function>&&)> completionHandler); void deleteSessionStorageOrigins(std::function completionHandler); void deleteSessionStorageEntriesForOrigins(const Vector>&, std::function completionHandler); void getLocalStorageOrigins(std::function>&&)> completionHandler); void deleteLocalStorageEntriesForOrigin(const WebCore::SecurityOrigin&); void deleteLocalStorageOriginsModifiedSince(std::chrono::system_clock::time_point, std::function completionHandler); void deleteLocalStorageEntriesForOrigins(const Vector>&, std::function completionHandler); void getLocalStorageOriginDetails(std::function)> completionHandler); private: explicit StorageManager(const String& localStorageDirectory); // IPC::Connection::WorkQueueMessageReceiver. virtual void didReceiveMessage(IPC::Connection&, IPC::MessageDecoder&) override; virtual void didReceiveSyncMessage(IPC::Connection&, IPC::MessageDecoder&, std::unique_ptr& replyEncoder) override; // Message handlers. void createLocalStorageMap(IPC::Connection&, uint64_t storageMapID, uint64_t storageNamespaceID, const WebCore::SecurityOriginData&); void createTransientLocalStorageMap(IPC::Connection&, uint64_t storageMapID, uint64_t storageNamespaceID, const WebCore::SecurityOriginData& topLevelOriginData, const WebCore::SecurityOriginData&); void createSessionStorageMap(IPC::Connection&, uint64_t storageMapID, uint64_t storageNamespaceID, const WebCore::SecurityOriginData&); void destroyStorageMap(IPC::Connection&, uint64_t storageMapID); void getValues(IPC::Connection&, uint64_t storageMapID, uint64_t storageMapSeed, HashMap& values); void setItem(IPC::Connection&, uint64_t storageAreaID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& value, const String& urlString); void removeItem(IPC::Connection&, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& urlString); void clear(IPC::Connection&, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& urlString); class StorageArea; StorageArea* findStorageArea(IPC::Connection&, uint64_t) const; class LocalStorageNamespace; LocalStorageNamespace* getOrCreateLocalStorageNamespace(uint64_t storageNamespaceID); class TransientLocalStorageNamespace; TransientLocalStorageNamespace* getOrCreateTransientLocalStorageNamespace(uint64_t storageNamespaceID, WebCore::SecurityOrigin& topLevelOrigin); RefPtr m_queue; RefPtr m_localStorageDatabaseTracker; HashMap> m_localStorageNamespaces; HashMap>, RefPtr> m_transientLocalStorageNamespaces; class SessionStorageNamespace; HashMap> m_sessionStorageNamespaces; HashMap, uint64_t>, RefPtr> m_storageAreasByConnection; }; } // namespace WebKit #endif // StorageManager_h