12bde8e466a4451c7319e3a072d118917957d6554Steve Block/*
22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Apple Inc. All rights reserved.
32bde8e466a4451c7319e3a072d118917957d6554Steve Block *
42bde8e466a4451c7319e3a072d118917957d6554Steve Block * Redistribution and use in source and binary forms, with or without
52bde8e466a4451c7319e3a072d118917957d6554Steve Block * modification, are permitted provided that the following conditions
62bde8e466a4451c7319e3a072d118917957d6554Steve Block * are met:
72bde8e466a4451c7319e3a072d118917957d6554Steve Block * 1. Redistributions of source code must retain the above copyright
82bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer.
92bde8e466a4451c7319e3a072d118917957d6554Steve Block * 2. Redistributions in binary form must reproduce the above copyright
102bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer in the
112bde8e466a4451c7319e3a072d118917957d6554Steve Block *    documentation and/or other materials provided with the distribution.
122bde8e466a4451c7319e3a072d118917957d6554Steve Block *
132bde8e466a4451c7319e3a072d118917957d6554Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
142bde8e466a4451c7319e3a072d118917957d6554Steve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
152bde8e466a4451c7319e3a072d118917957d6554Steve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
162bde8e466a4451c7319e3a072d118917957d6554Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
172bde8e466a4451c7319e3a072d118917957d6554Steve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
182bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
192bde8e466a4451c7319e3a072d118917957d6554Steve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
202bde8e466a4451c7319e3a072d118917957d6554Steve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
212bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
222bde8e466a4451c7319e3a072d118917957d6554Steve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
232bde8e466a4451c7319e3a072d118917957d6554Steve Block * THE POSSIBILITY OF SUCH DAMAGE.
242bde8e466a4451c7319e3a072d118917957d6554Steve Block */
252bde8e466a4451c7319e3a072d118917957d6554Steve Block
262bde8e466a4451c7319e3a072d118917957d6554Steve Block#ifndef StorageTracker_h
272bde8e466a4451c7319e3a072d118917957d6554Steve Block#define StorageTracker_h
282bde8e466a4451c7319e3a072d118917957d6554Steve Block
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(DOM_STORAGE)
302bde8e466a4451c7319e3a072d118917957d6554Steve Block
312bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "PlatformString.h"
322bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "SQLiteDatabase.h"
332bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/HashSet.h>
342bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/OwnPtr.h>
352bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/Vector.h>
362bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/text/StringHash.h>
372bde8e466a4451c7319e3a072d118917957d6554Steve Block
382bde8e466a4451c7319e3a072d118917957d6554Steve Blocknamespace WebCore {
392bde8e466a4451c7319e3a072d118917957d6554Steve Block
402bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass LocalStorageTask;
412bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass LocalStorageThread;
422bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass SecurityOrigin;
432bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass StorageTrackerClient;
442bde8e466a4451c7319e3a072d118917957d6554Steve Block
452bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass StorageTracker {
462bde8e466a4451c7319e3a072d118917957d6554Steve Block    WTF_MAKE_NONCOPYABLE(StorageTracker);
472bde8e466a4451c7319e3a072d118917957d6554Steve Block    WTF_MAKE_FAST_ALLOCATED;
482bde8e466a4451c7319e3a072d118917957d6554Steve Blockpublic:
492bde8e466a4451c7319e3a072d118917957d6554Steve Block    static void initializeTracker(const String& storagePath);
502bde8e466a4451c7319e3a072d118917957d6554Steve Block    static StorageTracker& tracker();
512bde8e466a4451c7319e3a072d118917957d6554Steve Block    static void scheduleTask(void*);
522bde8e466a4451c7319e3a072d118917957d6554Steve Block
532bde8e466a4451c7319e3a072d118917957d6554Steve Block    void importOriginIdentifiers();
542bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setOriginDetails(const String& originIdentifier, const String& databaseFile);
552bde8e466a4451c7319e3a072d118917957d6554Steve Block
562bde8e466a4451c7319e3a072d118917957d6554Steve Block    void deleteAllOrigins();
572bde8e466a4451c7319e3a072d118917957d6554Steve Block    void deleteOrigin(SecurityOrigin*);
582bde8e466a4451c7319e3a072d118917957d6554Steve Block    void deleteOrigin(const String& originIdentifier);
592bde8e466a4451c7319e3a072d118917957d6554Steve Block    void origins(Vector<RefPtr<SecurityOrigin> >& result);
602bde8e466a4451c7319e3a072d118917957d6554Steve Block
612bde8e466a4451c7319e3a072d118917957d6554Steve Block    void cancelDeletingOrigin(const String& originIdentifier);
622bde8e466a4451c7319e3a072d118917957d6554Steve Block
632bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setClient(StorageTrackerClient*);
642bde8e466a4451c7319e3a072d118917957d6554Steve Block
652bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool isActive();
662bde8e466a4451c7319e3a072d118917957d6554Steve Block
672bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Sync to disk on background thread.
682bde8e466a4451c7319e3a072d118917957d6554Steve Block    void syncDeleteAllOrigins();
692bde8e466a4451c7319e3a072d118917957d6554Steve Block    void syncDeleteOrigin(const String& originIdentifier);
702bde8e466a4451c7319e3a072d118917957d6554Steve Block    void syncSetOriginDetails(const String& originIdentifier, const String& databaseFile);
712bde8e466a4451c7319e3a072d118917957d6554Steve Block    void syncImportOriginIdentifiers();
722bde8e466a4451c7319e3a072d118917957d6554Steve Block    void syncFileSystemAndTrackerDatabase();
732bde8e466a4451c7319e3a072d118917957d6554Steve Block
742bde8e466a4451c7319e3a072d118917957d6554Steve Block    void syncLocalStorage();
752bde8e466a4451c7319e3a072d118917957d6554Steve Block
762bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate:
772bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker(const String& storagePath);
782bde8e466a4451c7319e3a072d118917957d6554Steve Block
792bde8e466a4451c7319e3a072d118917957d6554Steve Block    String trackerDatabasePath();
802bde8e466a4451c7319e3a072d118917957d6554Steve Block    void openTrackerDatabase(bool createIfDoesNotExist);
812bde8e466a4451c7319e3a072d118917957d6554Steve Block
822bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setStorageDirectoryPath(const String&);
832bde8e466a4451c7319e3a072d118917957d6554Steve Block
842bde8e466a4451c7319e3a072d118917957d6554Steve Block    void deleteTrackerFiles();
852bde8e466a4451c7319e3a072d118917957d6554Steve Block
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool canDeleteOrigin(const String& originIdentifier);
872bde8e466a4451c7319e3a072d118917957d6554Steve Block    void willDeleteOrigin(const String& originIdentifier);
882bde8e466a4451c7319e3a072d118917957d6554Steve Block    void willDeleteAllOrigins();
892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void deleteOriginOnMainThread(void* originIdentifier);
902bde8e466a4451c7319e3a072d118917957d6554Steve Block
912bde8e466a4451c7319e3a072d118917957d6554Steve Block    void originFilePaths(Vector<String>& paths);
922bde8e466a4451c7319e3a072d118917957d6554Steve Block
932bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setIsActive(bool);
942bde8e466a4451c7319e3a072d118917957d6554Steve Block
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Guard for m_database, m_storageDirectoryPath and static Strings in syncFileSystemAndTrackerDatabase().
962bde8e466a4451c7319e3a072d118917957d6554Steve Block    Mutex m_databaseGuard;
972bde8e466a4451c7319e3a072d118917957d6554Steve Block    SQLiteDatabase m_database;
982bde8e466a4451c7319e3a072d118917957d6554Steve Block    String m_storageDirectoryPath;
992bde8e466a4451c7319e3a072d118917957d6554Steve Block
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block    Mutex m_clientGuard;
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTrackerClient* m_client;
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Guard for m_originSet and m_originsBeingDeleted.
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block    Mutex m_originSetGuard;
1052bde8e466a4451c7319e3a072d118917957d6554Steve Block    typedef HashSet<String> OriginSet;
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block    OriginSet m_originSet;
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block    OriginSet m_originsBeingDeleted;
1082bde8e466a4451c7319e3a072d118917957d6554Steve Block
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block    OwnPtr<LocalStorageThread> m_thread;
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block
1112bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_isActive;
1122bde8e466a4451c7319e3a072d118917957d6554Steve Block};
1132bde8e466a4451c7319e3a072d118917957d6554Steve Block
1142bde8e466a4451c7319e3a072d118917957d6554Steve Block} // namespace WebCore
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif // ENABLE(DOM_STORAGE)
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif // StorageTracker_h
119