diff -r 000000000000 -r 4f2f89ce4247 WebCore/loader/icon/IconDatabase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebCore/loader/icon/IconDatabase.h Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) + * + * 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 COMPUTER, INC. ``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 COMPUTER, INC. OR + * 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 IconDatabase_h +#define IconDatabase_h + +#include "StringHash.h" +#include "Timer.h" +#include +#include +#include +#include + +#if ENABLE(ICONDATABASE) +#include "SQLiteDatabase.h" +#include +#endif + +namespace WebCore { + +class DocumentLoader; +class Image; +class IntSize; +class IconDatabaseClient; +class IconRecord; +class IconSnapshot; +class KURL; +class PageURLRecord; +class PageURLSnapshot; +class SharedBuffer; + +#if ENABLE(ICONDATABASE) +class SQLTransaction; +#endif + +enum IconLoadDecision { + IconLoadYes, + IconLoadNo, + IconLoadUnknown +}; + +class IconDatabase : public Noncopyable { + +// *** Main Thread Only *** +public: + void setClient(IconDatabaseClient*); + + bool open(const String& path); + void close(); + + void removeAllIcons(); + + Image* iconForPageURL(const String&, const IntSize&); + void readIconForPageURLFromDisk(const String&); + String iconURLForPageURL(const String&); + Image* defaultIcon(const IntSize&); + + void retainIconForPageURL(const String&); + void releaseIconForPageURL(const String&); + + void setIconDataForIconURL(PassRefPtr data, const String&); + void setIconURLForPageURL(const String& iconURL, const String& pageURL); + + IconLoadDecision loadDecisionForIconURL(const String&, DocumentLoader*); + bool iconDataKnownForIconURL(const String&); + + void setEnabled(bool enabled); + bool isEnabled() const; + + void setPrivateBrowsingEnabled(bool flag); + bool isPrivateBrowsingEnabled() const; + + static void delayDatabaseCleanup(); + static void allowDatabaseCleanup(); + static void checkIntegrityBeforeOpening(); + + // Support for WebCoreStatistics in WebKit + size_t pageURLMappingCount(); + size_t retainedPageURLCount(); + size_t iconRecordCount(); + size_t iconRecordCountWithData(); + +private: + IconDatabase(); + ~IconDatabase(); + friend IconDatabase* iconDatabase(); + +#if ENABLE(ICONDATABASE) + static void notifyPendingLoadDecisionsOnMainThread(void*); + void notifyPendingLoadDecisions(); + + void wakeSyncThread(); + void scheduleOrDeferSyncTimer(); + void syncTimerFired(Timer*); + + Timer m_syncTimer; + ThreadIdentifier m_syncThread; + bool m_syncThreadRunning; + + HashSet > m_loadersPendingDecision; + + RefPtr m_defaultIconRecord; +#endif // ENABLE(ICONDATABASE) + +// *** Any Thread *** +public: + bool isOpen() const; + String databasePath() const; + static String defaultDatabaseFilename(); + +#if ENABLE(ICONDATABASE) +private: + PassRefPtr getOrCreateIconRecord(const String& iconURL); + PageURLRecord* getOrCreatePageURLRecord(const String& pageURL); + + bool m_isEnabled; + bool m_privateBrowsingEnabled; + + mutable Mutex m_syncLock; + ThreadCondition m_syncCondition; + String m_databaseDirectory; + // Holding m_syncLock is required when accessing m_completeDatabasePath + String m_completeDatabasePath; + + bool m_threadTerminationRequested; + bool m_removeIconsRequested; + bool m_iconURLImportComplete; + + Mutex m_urlAndIconLock; + // Holding m_urlAndIconLock is required when accessing any of the following data structures or the objects they contain + HashMap m_iconURLToRecordMap; + HashMap m_pageURLToRecordMap; + HashSet m_retainedPageURLs; + + Mutex m_pendingSyncLock; + // Holding m_pendingSyncLock is required when accessing any of the following data structures + HashMap m_pageURLsPendingSync; + HashMap m_iconsPendingSync; + + Mutex m_pendingReadingLock; + // Holding m_pendingSyncLock is required when accessing any of the following data structures - when dealing with IconRecord*s, holding m_urlAndIconLock is also required + HashSet m_pageURLsPendingImport; + HashSet m_pageURLsInterestedInIcons; + HashSet m_iconsPendingReading; +#endif // ENABLE(ICONDATABASE) + +// *** Sync Thread Only *** +public: + // Should be used only on the sync thread and only by the Safari 2 Icons import procedure + void importIconURLForPageURL(const String& iconURL, const String& pageURL); + void importIconDataForIconURL(PassRefPtr data, const String& iconURL); + + bool shouldStopThreadActivity() const; + +#if ENABLE(ICONDATABASE) +private: + static void* iconDatabaseSyncThreadStart(void *); + void* iconDatabaseSyncThread(); + + // The following block of methods are called exclusively by the sync thread to manage i/o to and from the database + // Each method should periodically monitor m_threadTerminationRequested when it makes sense to return early on shutdown + void performOpenInitialization(); + bool checkIntegrity(); + void performURLImport(); + void* syncThreadMainLoop(); + bool readFromDatabase(); + bool writeToDatabase(); + void pruneUnretainedIcons(); + void checkForDanglingPageURLs(bool pruneIfFound); + void removeAllIconsOnThread(); + void deleteAllPreparedStatements(); + void* cleanupSyncThread(); + + // Record (on disk) whether or not Safari 2-style icons were imported (once per dataabse) + bool imported(); + void setImported(bool); + + bool m_initialPruningComplete; + + void setIconURLForPageURLInSQLDatabase(const String&, const String&); + void setIconIDForPageURLInSQLDatabase(int64_t, const String&); + void removePageURLFromSQLDatabase(const String& pageURL); + int64_t getIconIDForIconURLFromSQLDatabase(const String& iconURL); + int64_t addIconURLToSQLDatabase(const String&); + PassRefPtr getImageDataForIconURLFromSQLDatabase(const String& iconURL); + void removeIconFromSQLDatabase(const String& iconURL); + void writeIconSnapshotToSQLDatabase(const IconSnapshot&); + + // The client is set by the main thread before the thread starts, and from then on is only used by the sync thread + IconDatabaseClient* m_client; + + SQLiteDatabase m_syncDB; + + // Track whether the "Safari 2" import is complete and/or set in the database + bool m_imported; + bool m_isImportedSet; + + OwnPtr m_setIconIDForPageURLStatement; + OwnPtr m_removePageURLStatement; + OwnPtr m_getIconIDForIconURLStatement; + OwnPtr m_getImageDataForIconURLStatement; + OwnPtr m_addIconToIconInfoStatement; + OwnPtr m_addIconToIconDataStatement; + OwnPtr m_getImageDataStatement; + OwnPtr m_deletePageURLsForIconURLStatement; + OwnPtr m_deleteIconFromIconInfoStatement; + OwnPtr m_deleteIconFromIconDataStatement; + OwnPtr m_updateIconInfoStatement; + OwnPtr m_updateIconDataStatement; + OwnPtr m_setIconInfoStatement; + OwnPtr m_setIconDataStatement; +#endif // ENABLE(ICONDATABASE) +}; + +// Function to obtain the global icon database. +IconDatabase* iconDatabase(); + +} // namespace WebCore + +#endif // IconDatabase_h