Changeset 185412 in webkit


Ignore:
Timestamp:
Jun 10, 2015 6:00:49 AM (9 years ago)
Author:
Antti Koivisto
Message:

NetworkCache: Delete old cache versions
https://bugs.webkit.org/show_bug.cgi?id=145800

Reviewed by Darin Adler.

  • CMakeLists.txt:
  • NetworkProcess/cache/NetworkCacheBlobStorage.cpp:

(WebKit::NetworkCache::BlobStorage::synchronize):

  • NetworkProcess/cache/NetworkCacheFileSystem.cpp: Added.

(WebKit::NetworkCache::directoryEntryType):
(WebKit::NetworkCache::traverseDirectory):

Pass entry type as callback argument.

(WebKit::NetworkCache::deleteDirectoryRecursively):

Add helper.

(WebKit::NetworkCache::fileTimes):
(WebKit::NetworkCache::updateFileModificationTimeIfNeeded):

  • NetworkProcess/cache/NetworkCacheFileSystem.h: Copied from Source/WebKit2/NetworkProcess/cache/NetworkCacheFileSystemPosix.h.

Move code to cpp.

(WebKit::NetworkCache::traverseDirectory): Deleted.
(WebKit::NetworkCache::traverseCacheFiles): Deleted.
(WebKit::NetworkCache::fileTimes): Deleted.
(WebKit::NetworkCache::updateFileModificationTimeIfNeeded): Deleted.

  • NetworkProcess/cache/NetworkCacheFileSystemPosix.h: Removed.
  • NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm:
  • NetworkProcess/cache/NetworkCacheStatistics.cpp:

(WebKit::NetworkCache::Statistics::bootstrapFromNetworkCache):

  • NetworkProcess/cache/NetworkCacheStorage.cpp:

(WebKit::NetworkCache::makeBlobDirectoryPath):
(WebKit::NetworkCache::traverseRecordsFiles):

Move cache hierarchy aware traversal code here from NetworkCacheFileSystem (for better layering).
Rename for clarity.

(WebKit::NetworkCache::deleteEmptyRecordsDirectories):

Factor to a function.

(WebKit::NetworkCache::Storage::Storage):
(WebKit::NetworkCache::Storage::synchronize):
(WebKit::NetworkCache::Storage::traverse):
(WebKit::NetworkCache::Storage::clear):

Use traverseRecordsFiles for traversal.

(WebKit::NetworkCache::Storage::shrink):
(WebKit::NetworkCache::Storage::deleteOldVersions):

Delete version subdirectories with version number less than the current version.
Remove code for clearing unversioned V1 caches. No one should have them.

  • NetworkProcess/cache/NetworkCacheStorage.h:
  • UIProcess/API/APIUserContentExtensionStore.cpp:
  • WebKit2.xcodeproj/project.pbxproj:
Location:
trunk/Source/WebKit2
Files:
1 added
10 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/CMakeLists.txt

    r185358 r185412  
    172172    NetworkProcess/cache/NetworkCacheEncoder.cpp
    173173    NetworkProcess/cache/NetworkCacheEntry.cpp
     174    NetworkProcess/cache/NetworkCacheFileSystem.cpp
    174175    NetworkProcess/cache/NetworkCacheKey.cpp
    175176    NetworkProcess/cache/NetworkCacheStatistics.cpp
  • trunk/Source/WebKit2/ChangeLog

    r185410 r185412  
     12015-06-10  Antti Koivisto  <antti@apple.com>
     2
     3        NetworkCache: Delete old cache versions
     4        https://bugs.webkit.org/show_bug.cgi?id=145800
     5
     6        Reviewed by Darin Adler.
     7
     8        * CMakeLists.txt:
     9        * NetworkProcess/cache/NetworkCacheBlobStorage.cpp:
     10        (WebKit::NetworkCache::BlobStorage::synchronize):
     11        * NetworkProcess/cache/NetworkCacheFileSystem.cpp: Added.
     12        (WebKit::NetworkCache::directoryEntryType):
     13        (WebKit::NetworkCache::traverseDirectory):
     14
     15            Pass entry type as callback argument.
     16
     17        (WebKit::NetworkCache::deleteDirectoryRecursively):
     18
     19            Add helper.
     20
     21        (WebKit::NetworkCache::fileTimes):
     22        (WebKit::NetworkCache::updateFileModificationTimeIfNeeded):
     23        * NetworkProcess/cache/NetworkCacheFileSystem.h: Copied from Source/WebKit2/NetworkProcess/cache/NetworkCacheFileSystemPosix.h.
     24
     25            Move code to cpp.
     26
     27        (WebKit::NetworkCache::traverseDirectory): Deleted.
     28        (WebKit::NetworkCache::traverseCacheFiles): Deleted.
     29        (WebKit::NetworkCache::fileTimes): Deleted.
     30        (WebKit::NetworkCache::updateFileModificationTimeIfNeeded): Deleted.
     31        * NetworkProcess/cache/NetworkCacheFileSystemPosix.h: Removed.
     32        * NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm:
     33        * NetworkProcess/cache/NetworkCacheStatistics.cpp:
     34        (WebKit::NetworkCache::Statistics::bootstrapFromNetworkCache):
     35        * NetworkProcess/cache/NetworkCacheStorage.cpp:
     36        (WebKit::NetworkCache::makeBlobDirectoryPath):
     37        (WebKit::NetworkCache::traverseRecordsFiles):
     38
     39            Move cache hierarchy aware traversal code here from NetworkCacheFileSystem (for better layering).
     40            Rename for clarity.
     41
     42        (WebKit::NetworkCache::deleteEmptyRecordsDirectories):
     43
     44            Factor to a function.
     45
     46        (WebKit::NetworkCache::Storage::Storage):
     47        (WebKit::NetworkCache::Storage::synchronize):
     48        (WebKit::NetworkCache::Storage::traverse):
     49        (WebKit::NetworkCache::Storage::clear):
     50
     51            Use traverseRecordsFiles for traversal.
     52
     53        (WebKit::NetworkCache::Storage::shrink):
     54        (WebKit::NetworkCache::Storage::deleteOldVersions):
     55
     56            Delete version subdirectories with version number less than the current version.
     57            Remove code for clearing unversioned V1 caches. No one should have them.
     58
     59        * NetworkProcess/cache/NetworkCacheStorage.h:
     60        * UIProcess/API/APIUserContentExtensionStore.cpp:
     61        * WebKit2.xcodeproj/project.pbxproj:
     62
    1632015-06-10  Zan Dobersek  <zdobersek@igalia.com>
    264
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp

    r184449 r185412  
    3030
    3131#include "Logging.h"
    32 #include "NetworkCacheFileSystemPosix.h"
     32#include "NetworkCacheFileSystem.h"
    3333#include <WebCore/FileSystem.h>
    3434#include <fcntl.h>
    3535#include <sys/mman.h>
     36#include <sys/stat.h>
    3637#include <wtf/RunLoop.h>
    3738#include <wtf/SHA1.h>
     
    5960    m_approximateSize = 0;
    6061    auto blobDirectory = blobDirectoryPath();
    61     traverseDirectory(blobDirectory, DT_REG, [this, &blobDirectory](const String& name) {
     62    traverseDirectory(blobDirectory, [this, &blobDirectory](const String& name, DirectoryEntryType type) {
     63        if (type != DirectoryEntryType::File)
     64            return;
    6265        auto path = WebCore::pathByAppendingComponent(blobDirectory, name);
    6366        auto filePath = WebCore::fileSystemRepresentation(path);
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheFileSystem.h

    r185362 r185412  
    2424 */
    2525
    26 #ifndef NetworkCacheFileSystemPosix_h
    27 #define NetworkCacheFileSystemPosix_h
     26#ifndef NetworkCacheFileSystem_h
     27#define NetworkCacheFileSystem_h
    2828
    2929#if ENABLE(NETWORK_CACHE)
    3030
    3131#include <WebCore/FileSystem.h>
    32 #include <dirent.h>
    33 #include <sys/stat.h>
    34 #include <sys/time.h>
    35 #include <wtf/text/CString.h>
    36 
    37 #if USE(SOUP)
    38 #include <wtf/gobject/GRefPtr.h>
    39 #endif
     32#include <functional>
    4033
    4134namespace WebKit {
    4235namespace NetworkCache {
    4336
    44 template <typename Function>
    45 static void traverseDirectory(const String& path, uint8_t type, const Function& function)
    46 {
    47     DIR* dir = opendir(WebCore::fileSystemRepresentation(path).data());
    48     if (!dir)
    49         return;
    50     struct dirent* dp;
    51     while ((dp = readdir(dir))) {
    52         if (dp->d_type != type)
    53             continue;
    54         const char* name = dp->d_name;
    55         if (!strcmp(name, ".") || !strcmp(name, ".."))
    56             continue;
    57         function(String(name));
    58     }
    59     closedir(dir);
    60 }
     37enum class DirectoryEntryType { Directory, File };
     38void traverseDirectory(const String& path, const std::function<void (const String& fileName, DirectoryEntryType)>&);
    6139
    62 template <typename Function>
    63 inline void traverseCacheFiles(const String& cachePath, const Function& function)
    64 {
    65     traverseDirectory(cachePath, DT_DIR, [&cachePath, &function](const String& subdirName) {
    66         String partitionPath = WebCore::pathByAppendingComponent(cachePath, subdirName);
    67         traverseDirectory(partitionPath, DT_REG, [&function, &partitionPath](const String& fileName) {
    68             function(fileName, partitionPath);
    69         });
    70     });
    71 }
     40void deleteDirectoryRecursively(const String& path);
    7241
    7342struct FileTimes {
     
    7544    std::chrono::system_clock::time_point modification;
    7645};
    77 
    78 inline FileTimes fileTimes(const String& path)
    79 {
    80 #if HAVE(STAT_BIRTHTIME)
    81     struct stat fileInfo;
    82     if (stat(WebCore::fileSystemRepresentation(path).data(), &fileInfo))
    83         return { };
    84     return { std::chrono::system_clock::from_time_t(fileInfo.st_birthtime), std::chrono::system_clock::from_time_t(fileInfo.st_mtime) };
    85 #elif USE(SOUP)
    86     // There's no st_birthtime in some operating systems like Linux, so we use xattrs to set/get the creation time.
    87     GRefPtr<GFile> file = adoptGRef(g_file_new_for_path(WebCore::fileSystemRepresentation(path).data()));
    88     GRefPtr<GFileInfo> fileInfo = adoptGRef(g_file_query_info(file.get(), "xattr::birthtime,time::modified", G_FILE_QUERY_INFO_NONE, nullptr, nullptr));
    89     if (!fileInfo)
    90         return { };
    91     const char* birthtimeString = g_file_info_get_attribute_string(fileInfo.get(), "xattr::birthtime");
    92     if (!birthtimeString)
    93         return { };
    94     return { std::chrono::system_clock::from_time_t(g_ascii_strtoull(birthtimeString, nullptr, 10)),
    95         std::chrono::system_clock::from_time_t(g_file_info_get_attribute_uint64(fileInfo.get(), "time::modified")) };
    96 #endif
    97 }
    98 
    99 inline void updateFileModificationTimeIfNeeded(const String& path)
    100 {
    101     auto times = fileTimes(path);
    102     if (times.creation != times.modification) {
    103         // Don't update more than once per hour.
    104         if (std::chrono::system_clock::now() - times.modification < std::chrono::hours(1))
    105             return;
    106     }
    107     // This really updates both the access time and the modification time.
    108     utimes(WebCore::fileSystemRepresentation(path).data(), 0);
    109 }
     46FileTimes fileTimes(const String& path);
     47void updateFileModificationTimeIfNeeded(const String& path);
    11048
    11149}
    11250}
    11351
    114 #endif // ENABLE(NETWORK_CACHE)
     52#endif
    11553
    116 #endif // NetworkCacheFileSystemPosix_h
     54#endif
    11755
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm

    r182856 r185412  
    2929#if ENABLE(NETWORK_CACHE)
    3030
    31 #include "NetworkCacheFileSystemPosix.h"
     31#include "NetworkCacheFileSystem.h"
    3232#include <dispatch/dispatch.h>
    3333#include <mach/vm_param.h>
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp

    r185366 r185412  
    2929#if ENABLE(NETWORK_CACHE)
    3030
    31 #include "NetworkCacheFileSystemPosix.h"
     31#include "NetworkCacheFileSystem.h"
    3232#include <wtf/MainThread.h>
    3333#include <wtf/gobject/GMainLoopSource.h>
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.cpp

    r183467 r185412  
    3131#include "Logging.h"
    3232#include "NetworkCache.h"
    33 #include "NetworkCacheFileSystemPosix.h"
     33#include "NetworkCacheFileSystem.h"
    3434#include "NetworkProcess.h"
    3535#include <WebCore/DiagnosticLoggingKeys.h>
     
    145145
    146146    Vector<StringCapture> hashes;
    147     traverseCacheFiles(networkCachePath, [&hashes](const String& hashString, const String&) {
     147    traverseRecordsFiles(networkCachePath, [&hashes](const String& hashString, const String&) {
    148148        Key::HashType hash;
    149149        if (!Key::stringToHash(hashString, hash))
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp

    r185262 r185412  
    3131#include "Logging.h"
    3232#include "NetworkCacheCoders.h"
    33 #include "NetworkCacheFileSystemPosix.h"
     33#include "NetworkCacheFileSystem.h"
    3434#include "NetworkCacheIOChannel.h"
    3535#include <wtf/PageBlock.h>
     
    100100}
    101101
     102void traverseRecordsFiles(const String& recordsPath, const std::function<void (const String&, const String&)>& function)
     103{
     104    traverseDirectory(recordsPath, [&recordsPath, &function](const String& subdirName, DirectoryEntryType type) {
     105        if (type != DirectoryEntryType::Directory)
     106            return;
     107        String partitionPath = WebCore::pathByAppendingComponent(recordsPath, subdirName);
     108        traverseDirectory(partitionPath, [&function, &partitionPath](const String& fileName, DirectoryEntryType type) {
     109            if (type != DirectoryEntryType::File)
     110                return;
     111            function(fileName, partitionPath);
     112        });
     113    });
     114}
     115
     116static void deleteEmptyRecordsDirectories(const String& recordsPath)
     117{
     118    traverseDirectory(recordsPath, [&recordsPath](const String& subdirName, DirectoryEntryType type) {
     119        if (type != DirectoryEntryType::Directory)
     120            return;
     121        // Let system figure out if it is really empty.
     122        WebCore::deleteEmptyDirectory(WebCore::pathByAppendingComponent(recordsPath, subdirName));
     123    });
     124}
     125
    102126Storage::Storage(const String& baseDirectoryPath)
    103127    : m_basePath(baseDirectoryPath)
     
    151175        size_t recordsSize = 0;
    152176        unsigned count = 0;
    153         traverseCacheFiles(recordsPath(), [&recordFilter, &bodyFilter, &recordsSize, &count](const String& fileName, const String& partitionPath) {
     177        traverseRecordsFiles(recordsPath(), [&recordFilter, &bodyFilter, &recordsSize, &count](const String& fileName, const String& partitionPath) {
    154178            auto filePath = WebCore::pathByAppendingComponent(partitionPath, fileName);
    155179
     
    665689    ioQueue().dispatch([this, flags, traverseHandlerPtr] {
    666690        auto& traverseHandler = *traverseHandlerPtr;
    667         traverseCacheFiles(recordsPath(), [this, flags, &traverseHandler](const String& fileName, const String& partitionPath) {
     691        traverseRecordsFiles(recordsPath(), [this, flags, &traverseHandler](const String& fileName, const String& partitionPath) {
    668692            if (fileName.length() != Key::hashStringLength())
    669693                return;
     
    730754    ioQueue().dispatch([this, modifiedSinceTime, completionHandlerPtr] {
    731755        auto recordsPath = this->recordsPath();
    732         traverseDirectory(recordsPath, DT_DIR, [&recordsPath, modifiedSinceTime](const String& subdirName) {
    733             String subdirPath = WebCore::pathByAppendingComponent(recordsPath, subdirName);
    734             traverseDirectory(subdirPath, DT_REG, [&subdirPath, modifiedSinceTime](const String& fileName) {
    735                 auto filePath = WebCore::pathByAppendingComponent(subdirPath, fileName);
    736                 if (modifiedSinceTime > std::chrono::system_clock::time_point::min()) {
    737                     auto times = fileTimes(filePath);
    738                     if (times.modification < modifiedSinceTime)
    739                         return;
    740                 }
    741                 WebCore::deleteFile(filePath);
    742             });
    743             WebCore::deleteEmptyDirectory(subdirPath);
    744         });
     756        traverseRecordsFiles(recordsPath, [modifiedSinceTime](const String& fileName, const String& partitionPath) {
     757            auto filePath = WebCore::pathByAppendingComponent(partitionPath, fileName);
     758            if (modifiedSinceTime > std::chrono::system_clock::time_point::min()) {
     759                auto times = fileTimes(filePath);
     760                if (times.modification < modifiedSinceTime)
     761                    return;
     762            }
     763            WebCore::deleteFile(filePath);
     764        });
     765
     766        deleteEmptyRecordsDirectories(recordsPath);
    745767
    746768        // This cleans unreferences blobs.
     
    810832    backgroundIOQueue().dispatch([this] {
    811833        auto recordsPath = this->recordsPath();
    812         traverseCacheFiles(recordsPath, [this](const String& fileName, const String& partitionPath) {
     834        traverseRecordsFiles(recordsPath, [this](const String& fileName, const String& partitionPath) {
    813835            if (fileName.length() != Key::hashStringLength())
    814836                return;
     
    830852        });
    831853
    832         // Let system figure out if they are really empty.
    833         traverseDirectory(recordsPath, DT_DIR, [&recordsPath](const String& subdirName) {
    834             auto partitionPath = WebCore::pathByAppendingComponent(recordsPath, subdirName);
    835             WebCore::deleteEmptyDirectory(partitionPath);
    836         });
     854        deleteEmptyRecordsDirectories(recordsPath);
    837855
    838856        RunLoop::main().dispatch([this] {
     
    848866void Storage::deleteOldVersions()
    849867{
    850     // Delete V1 cache.
    851868    backgroundIOQueue().dispatch([this] {
    852869        auto cachePath = basePath();
    853         traverseDirectory(cachePath, DT_DIR, [&cachePath](const String& subdirName) {
    854             if (subdirName.startsWith(versionDirectoryPrefix))
    855                 return;
    856             String partitionPath = WebCore::pathByAppendingComponent(cachePath, subdirName);
    857             traverseDirectory(partitionPath, DT_REG, [&partitionPath](const String& fileName) {
    858                 WebCore::deleteFile(WebCore::pathByAppendingComponent(partitionPath, fileName));
    859             });
    860             WebCore::deleteEmptyDirectory(partitionPath);
    861         });
    862     });
    863     // FIXME: Delete V2 cache.
     870        traverseDirectory(cachePath, [&cachePath](const String& subdirName, DirectoryEntryType type) {
     871            if (type != DirectoryEntryType::Directory)
     872                return;
     873            if (!subdirName.startsWith(versionDirectoryPrefix))
     874                return;
     875            auto versionString = subdirName.substring(strlen(versionDirectoryPrefix));
     876            bool success;
     877            unsigned directoryVersion = versionString.toUIntStrict(&success);
     878            if (!success)
     879                return;
     880            if (directoryVersion >= version)
     881                return;
     882
     883            auto oldVersionPath = WebCore::pathByAppendingComponent(cachePath, subdirName);
     884            LOG(NetworkCacheStorage, "(NetworkProcess) deleting old cache version, path %s", oldVersionPath.utf8().data());
     885
     886            deleteDirectoryRecursively(oldVersionPath);
     887        });
     888    });
    864889}
    865890
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h

    r184898 r185412  
    159159};
    160160
     161// FIXME: Remove, used by NetworkCacheStatistics only.
     162void traverseRecordsFiles(const String& recordsPath, const std::function<void (const String&, const String&)>&);
     163
    161164}
    162165}
  • trunk/Source/WebKit2/UIProcess/API/APIUserContentExtensionStore.cpp

    r184726 r185412  
    3333#include "NetworkCacheDecoder.h"
    3434#include "NetworkCacheEncoder.h"
    35 #include "NetworkCacheFileSystemPosix.h"
     35#include "NetworkCacheFileSystem.h"
    3636#include "SharedMemory.h"
    3737#include "WebCompiledContentExtension.h"
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r185331 r185412  
    12001200                7EC4F0FB18E4ACBB008056AF /* NetworkProcessCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7EC4F0F918E4A945008056AF /* NetworkProcessCocoa.mm */; };
    12011201                83048AE61ACA45DC0082C832 /* ProcessThrottlerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 83048AE51ACA45DC0082C832 /* ProcessThrottlerClient.h */; };
    1202                 834B250F1A831A8D00CFB150 /* NetworkCacheFileSystemPosix.h in Headers */ = {isa = PBXBuildFile; fileRef = 834B250E1A831A8D00CFB150 /* NetworkCacheFileSystemPosix.h */; };
     1202                834B250F1A831A8D00CFB150 /* NetworkCacheFileSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = 834B250E1A831A8D00CFB150 /* NetworkCacheFileSystem.h */; };
    12031203                834B25121A842C8700CFB150 /* NetworkCacheStatistics.h in Headers */ = {isa = PBXBuildFile; fileRef = 834B25101A842C8700CFB150 /* NetworkCacheStatistics.h */; };
    12041204                8360349F1ACB34D600626549 /* WebSQLiteDatabaseTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8360349D1ACB34D600626549 /* WebSQLiteDatabaseTracker.cpp */; };
     
    18061806                E4436ECF1A0D040B00EAD204 /* NetworkCacheStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = E4436EC21A0CFDB200EAD204 /* NetworkCacheStorage.h */; };
    18071807                E4436ED01A0D040B00EAD204 /* NetworkCacheStorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4436EC31A0CFDB200EAD204 /* NetworkCacheStorage.cpp */; };
     1808                E4697CCD1B25EB8F001B0A6C /* NetworkCacheFileSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4697CCC1B25EB8F001B0A6C /* NetworkCacheFileSystem.cpp */; };
    18081809                E47D1E981B0649FB002676A8 /* NetworkCacheData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E47D1E961B062B66002676A8 /* NetworkCacheData.cpp */; };
    18091810                E489D28A1A0A2DB80078C06A /* NetworkCacheCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E489D2831A0A2DB80078C06A /* NetworkCacheCoder.h */; };
     
    34353436                7EC4F0F918E4A945008056AF /* NetworkProcessCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NetworkProcessCocoa.mm; path = NetworkProcess/cocoa/NetworkProcessCocoa.mm; sourceTree = "<group>"; };
    34363437                83048AE51ACA45DC0082C832 /* ProcessThrottlerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProcessThrottlerClient.h; sourceTree = "<group>"; };
    3437                 834B250E1A831A8D00CFB150 /* NetworkCacheFileSystemPosix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheFileSystemPosix.h; sourceTree = "<group>"; };
     3438                834B250E1A831A8D00CFB150 /* NetworkCacheFileSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheFileSystem.h; sourceTree = "<group>"; };
    34383439                834B25101A842C8700CFB150 /* NetworkCacheStatistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheStatistics.h; sourceTree = "<group>"; };
    34393440                8360349D1ACB34D600626549 /* WebSQLiteDatabaseTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebSQLiteDatabaseTracker.cpp; sourceTree = "<group>"; };
     
    40854086                E4436EC21A0CFDB200EAD204 /* NetworkCacheStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheStorage.h; sourceTree = "<group>"; };
    40864087                E4436EC31A0CFDB200EAD204 /* NetworkCacheStorage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheStorage.cpp; sourceTree = "<group>"; };
     4088                E4697CCC1B25EB8F001B0A6C /* NetworkCacheFileSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheFileSystem.cpp; sourceTree = "<group>"; };
    40874089                E47D1E961B062B66002676A8 /* NetworkCacheData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheData.cpp; sourceTree = "<group>"; };
    40884090                E489D2831A0A2DB80078C06A /* NetworkCacheCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheCoder.h; sourceTree = "<group>"; };
     
    75707572                                E413F59E1AC1AF9D00345360 /* NetworkCacheEntry.cpp */,
    75717573                                E413F59B1AC1ADB600345360 /* NetworkCacheEntry.h */,
    7572                                 834B250E1A831A8D00CFB150 /* NetworkCacheFileSystemPosix.h */,
     7574                                834B250E1A831A8D00CFB150 /* NetworkCacheFileSystem.h */,
     7575                                E4697CCC1B25EB8F001B0A6C /* NetworkCacheFileSystem.cpp */,
    75737576                                E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */,
    75747577                                E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */,
     
    78657868                                E489D2901A0A2DB80078C06A /* NetworkCacheEncoder.h in Headers */,
    78667869                                E413F59D1AC1ADC400345360 /* NetworkCacheEntry.h in Headers */,
    7867                                 834B250F1A831A8D00CFB150 /* NetworkCacheFileSystemPosix.h in Headers */,
     7870                                834B250F1A831A8D00CFB150 /* NetworkCacheFileSystem.h in Headers */,
    78687871                                E42E06101AA7523B00B11699 /* NetworkCacheIOChannel.h in Headers */,
    78697872                                E4436ECE1A0D040B00EAD204 /* NetworkCacheKey.h in Headers */,
     
    96779680                                E489D28D1A0A2DB80078C06A /* NetworkCacheDecoder.cpp in Sources */,
    96789681                                E489D28F1A0A2DB80078C06A /* NetworkCacheEncoder.cpp in Sources */,
     9682                                E4697CCD1B25EB8F001B0A6C /* NetworkCacheFileSystem.cpp in Sources */,
    96799683                                E413F59F1AC1AF9D00345360 /* NetworkCacheEntry.cpp in Sources */,
    96809684                                E42E060F1AA7523400B11699 /* NetworkCacheIOChannelCocoa.mm in Sources */,
Note: See TracChangeset for help on using the changeset viewer.