Changeset 156918 in webkit


Ignore:
Timestamp:
Oct 4, 2013 3:41:11 PM (11 years ago)
Author:
dbates@webkit.org
Message:

[iOS] Upstream disk image cache
https://bugs.webkit.org/show_bug.cgi?id=121985

Reviewed by Joseph Pecoraro.

Source/WebCore:

  • WebCore.exp.in:
  • WebCore.xcodeproj/project.pbxproj:
  • loader/ResourceBuffer.cpp:

(WebCore::ResourceBuffer::isUsingDiskImageCache):

  • loader/ResourceBuffer.h:
  • loader/cache/CachedImage.cpp:

(WebCore::CachedImage::canUseDiskImageCache): Added.
(WebCore::CachedImage::useDiskImageCache): Added.

  • loader/cache/CachedImage.h:
  • loader/cache/CachedResource.cpp:

(WebCore::CachedResource::isSafeToMakePurgeable):
(WebCore::CachedResource::isUsingDiskImageCache): Added.

  • loader/cache/CachedResource.h:

(WebCore::CachedResource::canUseDiskImageCache): Added.
(WebCore::CachedResource::useDiskImageCache): Added.

  • loader/cache/MemoryCache.cpp:

(WebCore::MemoryCache::flushCachedImagesToDisk): Added.
(WebCore::MemoryCache::TypeStatistic::addResource):
(WebCore::MemoryCache::dumpStats):
(WebCore::MemoryCache::dumpLRULists):

  • loader/cache/MemoryCache.h:

(WebCore::MemoryCache::TypeStatistic::TypeStatistic):

  • loader/ios/DiskImageCacheClientIOS.h: Added.
  • loader/ios/DiskImageCacheIOS.h: Added.
  • loader/ios/DiskImageCacheIOS.mm: Added.
  • platform/Logging.h:
  • platform/SharedBuffer.cpp:

(WebCore::SharedBuffer::SharedBuffer):
(WebCore::SharedBuffer::~SharedBuffer):
(WebCore::SharedBuffer::isAllowedToBeMemoryMapped): Added.
(WebCore::SharedBuffer::allowToBeMemoryMapped): Added.
(WebCore::SharedBuffer::failedMemoryMap): Added.
(WebCore::SharedBuffer::markAsMemoryMapped): Added.
(WebCore::SharedBuffer::memoryMappedNotificationCallbackData): Added.
(WebCore::SharedBuffer::memoryMappedNotificationCallback): Added.
(WebCore::SharedBuffer::setMemoryMappedNotificationCallback): Added.
(WebCore::SharedBuffer::data):
(WebCore::SharedBuffer::append):
(WebCore::SharedBuffer::buffer):
(WebCore::SharedBuffer::getSomeData):

  • platform/SharedBuffer.h:

(WebCore::SharedBuffer::isMemoryMapped): Added.

  • platform/cf/SharedBufferCF.cpp:

(WebCore::SharedBuffer::SharedBuffer):

Source/WebKit:

  • WebKit.xcodeproj/project.pbxproj:
  • ios/WebCoreSupport/WebDiskImageCacheClientIOS.h: Added.
  • ios/WebCoreSupport/WebDiskImageCacheClientIOS.mm: Added.

Source/WebKit/mac:

  • Misc/WebCache.mm:

(+[WebCache statistics]):

  • WebView/WebDataSource.mm:

(BufferMemoryMapped): Added.
(-[WebDataSource _setAllowToBeMemoryMapped]): Added.
(-[WebDataSource setDataSourceDelegate:]): Added.
(-[WebDataSource dataSourceDelegate]): Added.
(-[WebDataSource dealloc]):

  • WebView/WebDataSourcePrivate.h: Declared private delegate

protocol, WebDataSourcePrivateDelegate.

  • WebView/WebPreferenceKeysPrivate.h:
  • WebView/WebPreferences.mm:

(+[WebPreferences initialize]):
(-[WebPreferences diskImageCacheEnabled]): Added.
(-[WebPreferences setDiskImageCacheEnabled:]): Added.
(-[WebPreferences diskImageCacheMinimumImageSize]): Added.
(-[WebPreferences setDiskImageCacheMinimumImageSize:]): Added.
(-[WebPreferences diskImageCacheMaximumCacheSize]): Added.
(-[WebPreferences setDiskImageCacheMaximumCacheSize:]): Added.
(-[WebPreferences _diskImageCacheSavedCacheDirectory]): Added.
(-[WebPreferences _setDiskImageCacheSavedCacheDirectory:]): Added.

  • WebView/WebView.mm:

(-[WebView _commonInitializationWithFrameName:groupName:]):
(-[WebView _preferencesChanged:]):

Location:
trunk/Source
Files:
8 added
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r156916 r156918  
     12013-10-04  Daniel Bates  <dabates@apple.com>
     2
     3        [iOS] Upstream disk image cache
     4        https://bugs.webkit.org/show_bug.cgi?id=121985
     5
     6        Reviewed by Joseph Pecoraro.
     7
     8        * WebCore.exp.in:
     9        * WebCore.xcodeproj/project.pbxproj:
     10        * loader/ResourceBuffer.cpp:
     11        (WebCore::ResourceBuffer::isUsingDiskImageCache):
     12        * loader/ResourceBuffer.h:
     13        * loader/cache/CachedImage.cpp:
     14        (WebCore::CachedImage::canUseDiskImageCache): Added.
     15        (WebCore::CachedImage::useDiskImageCache): Added.
     16        * loader/cache/CachedImage.h:
     17        * loader/cache/CachedResource.cpp:
     18        (WebCore::CachedResource::isSafeToMakePurgeable):
     19        (WebCore::CachedResource::isUsingDiskImageCache): Added.
     20        * loader/cache/CachedResource.h:
     21        (WebCore::CachedResource::canUseDiskImageCache): Added.
     22        (WebCore::CachedResource::useDiskImageCache): Added.
     23        * loader/cache/MemoryCache.cpp:
     24        (WebCore::MemoryCache::flushCachedImagesToDisk): Added.
     25        (WebCore::MemoryCache::TypeStatistic::addResource):
     26        (WebCore::MemoryCache::dumpStats):
     27        (WebCore::MemoryCache::dumpLRULists):
     28        * loader/cache/MemoryCache.h:
     29        (WebCore::MemoryCache::TypeStatistic::TypeStatistic):
     30        * loader/ios/DiskImageCacheClientIOS.h: Added.
     31        * loader/ios/DiskImageCacheIOS.h: Added.
     32        * loader/ios/DiskImageCacheIOS.mm: Added.
     33        * platform/Logging.h:
     34        * platform/SharedBuffer.cpp:
     35        (WebCore::SharedBuffer::SharedBuffer):
     36        (WebCore::SharedBuffer::~SharedBuffer):
     37        (WebCore::SharedBuffer::isAllowedToBeMemoryMapped): Added.
     38        (WebCore::SharedBuffer::allowToBeMemoryMapped): Added.
     39        (WebCore::SharedBuffer::failedMemoryMap): Added.
     40        (WebCore::SharedBuffer::markAsMemoryMapped): Added.
     41        (WebCore::SharedBuffer::memoryMappedNotificationCallbackData): Added.
     42        (WebCore::SharedBuffer::memoryMappedNotificationCallback): Added.
     43        (WebCore::SharedBuffer::setMemoryMappedNotificationCallback): Added.
     44        (WebCore::SharedBuffer::data):
     45        (WebCore::SharedBuffer::append):
     46        (WebCore::SharedBuffer::buffer):
     47        (WebCore::SharedBuffer::getSomeData):
     48        * platform/SharedBuffer.h:
     49        (WebCore::SharedBuffer::isMemoryMapped): Added.
     50        * platform/cf/SharedBufferCF.cpp:
     51        (WebCore::SharedBuffer::SharedBuffer):
     52
    1532013-10-04  Bear Travis  <betravis@adobe.com>
    254
  • trunk/Source/WebCore/WebCore.exp.in

    r156842 r156918  
    24492449#endif
    24502450
     2451#if ENABLE(DISK_IMAGE_CACHE)
     2452__ZN7WebCore14diskImageCacheEv
     2453__ZN7WebCore11MemoryCache23flushCachedImagesToDiskEv
     2454__ZNK7WebCore12SharedBuffer32memoryMappedNotificationCallbackEv
     2455__ZN7WebCore12SharedBuffer21allowToBeMemoryMappedEv
     2456__ZN7WebCore12SharedBuffer35setMemoryMappedNotificationCallbackEPFvN3WTF10PassRefPtrIS0_EENS0_16CompletionStatusEPvES5_
     2457__ZNK7WebCore12SharedBuffer25isAllowedToBeMemoryMappedEv
     2458__ZNK7WebCore12SharedBuffer36memoryMappedNotificationCallbackDataEv
     2459#endif
     2460
    24512461#if ENABLE(DRAG_SUPPORT)
    24522462__ZN7WebCore12EventHandler17dragSourceEndedAtERKNS_18PlatformMouseEventENS_13DragOperationE
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r156842 r156918  
    34473447                A5AFB34F115151A700B045CB /* StepRange.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5AFB34D115151A700B045CB /* StepRange.cpp */; };
    34483448                A5AFB350115151A700B045CB /* StepRange.h in Headers */ = {isa = PBXBuildFile; fileRef = A5AFB34E115151A700B045CB /* StepRange.h */; settings = {ATTRIBUTES = (Private, ); }; };
     3449                A5C566AB127A3AAD00E8A3FF /* DiskImageCacheClientIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = A5C566AA127A3AAD00E8A3FF /* DiskImageCacheClientIOS.h */; settings = {ATTRIBUTES = (Private, ); }; };
     3450                A5F9EF701266750D00FCCF52 /* DiskImageCacheIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = A5F9EF6E1266750D00FCCF52 /* DiskImageCacheIOS.mm */; };
     3451                A5F9EF711266750D00FCCF52 /* DiskImageCacheIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = A5F9EF6F1266750D00FCCF52 /* DiskImageCacheIOS.h */; settings = {ATTRIBUTES = (Private, ); }; };
    34493452                A6148A6212E41D3A0044A784 /* DOMHTMLKeygenElementInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A6148A6112E41D3A0044A784 /* DOMHTMLKeygenElementInternal.h */; };
    34503453                A6148A6712E41D940044A784 /* DOMHTMLKeygenElement.h in Headers */ = {isa = PBXBuildFile; fileRef = A6148A6512E41D940044A784 /* DOMHTMLKeygenElement.h */; };
     
    1004910052                A5AFB34D115151A700B045CB /* StepRange.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StepRange.cpp; sourceTree = "<group>"; };
    1005010053                A5AFB34E115151A700B045CB /* StepRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StepRange.h; sourceTree = "<group>"; };
     10054                A5C566AA127A3AAD00E8A3FF /* DiskImageCacheClientIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiskImageCacheClientIOS.h; sourceTree = "<group>"; };
    1005110055                A5C974CF11485FF10066F2AB /* KeyEventCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KeyEventCocoa.h; path = cocoa/KeyEventCocoa.h; sourceTree = "<group>"; };
    1005210056                A5C974D011485FF10066F2AB /* KeyEventCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = KeyEventCocoa.mm; path = cocoa/KeyEventCocoa.mm; sourceTree = "<group>"; };
     10057                A5F9EF6E1266750D00FCCF52 /* DiskImageCacheIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DiskImageCacheIOS.mm; sourceTree = "<group>"; };
     10058                A5F9EF6F1266750D00FCCF52 /* DiskImageCacheIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiskImageCacheIOS.h; sourceTree = "<group>"; };
    1005310059                A6148A6112E41D3A0044A784 /* DOMHTMLKeygenElementInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMHTMLKeygenElementInternal.h; sourceTree = "<group>"; };
    1005410060                A6148A6512E41D940044A784 /* DOMHTMLKeygenElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMHTMLKeygenElement.h; sourceTree = "<group>"; };
     
    1944519451                                7EE6847312D26E5500E79415 /* cf */,
    1944619452                                5126E6B60A2E3AEF005C29FA /* icon */,
     19453                                CE79D68617F220ED00815C00 /* ios */,
    1944719454                                93A1EAA20A5634D8006960A0 /* mac */,
    1944819455                                E1424C91164B52C800F32D40 /* CookieJar.cpp */,
     
    1984819855                        );
    1984919856                        name = MediaControls;
     19857                        sourceTree = "<group>";
     19858                };
     19859                CE79D68617F220ED00815C00 /* ios */ = {
     19860                        isa = PBXGroup;
     19861                        children = (
     19862                                A5F9EF6E1266750D00FCCF52 /* DiskImageCacheIOS.mm */,
     19863                                A5F9EF6F1266750D00FCCF52 /* DiskImageCacheIOS.h */,
     19864                                A5C566AA127A3AAD00E8A3FF /* DiskImageCacheClientIOS.h */,
     19865                        );
     19866                        path = ios;
    1985019867                        sourceTree = "<group>";
    1985119868                };
     
    2175521772                                316023F01532C40C00D50FF4 /* Dictionary.h in Headers */,
    2175621773                                FDAF19991513D131008DB0C3 /* DirectConvolver.h in Headers */,
     21774                                A5F9EF711266750D00FCCF52 /* DiskImageCacheIOS.h in Headers */,
     21775                                A5C566AB127A3AAD00E8A3FF /* DiskImageCacheClientIOS.h in Headers */,
    2175721776                                49AF2D6914435D050016A784 /* DisplayRefreshMonitor.h in Headers */,
    2175821777                                5D8C4DC01428222C0026CE72 /* DisplaySleepDisabler.h in Headers */,
     
    2517825197                                312D67B11535691F00563D0D /* Dictionary.cpp in Sources */,
    2517925198                                FDAF19981513D131008DB0C3 /* DirectConvolver.cpp in Sources */,
     25199                                A5F9EF701266750D00FCCF52 /* DiskImageCacheIOS.mm in Sources */,
    2518025200                                49FC7A501444AF5F00A5D864 /* DisplayRefreshMonitor.cpp in Sources */,
    2518125201                                49AF2D6C14435D210016A784 /* DisplayRefreshMonitorMac.cpp in Sources */,
  • trunk/Source/WebCore/loader/ResourceBuffer.cpp

    r155629 r156918  
    133133#endif
    134134
     135#if ENABLE(DISK_IMAGE_CACHE)
     136bool ResourceBuffer::isUsingDiskImageCache() const
     137{
     138    ASSERT(m_sharedBuffer);
     139    return m_sharedBuffer && m_sharedBuffer->isAllowedToBeMemoryMapped();
     140}
     141#endif
     142
    135143} // namespace WebCore
  • trunk/Source/WebCore/loader/ResourceBuffer.h

    r155641 r156918  
    8282    RetainPtr<CFDataRef> createCFData();
    8383#endif
     84#if ENABLE(DISK_IMAGE_CACHE)
     85    bool isUsingDiskImageCache() const;
     86#endif
    8487
    8588protected:
  • trunk/Source/WebCore/loader/cache/CachedImage.cpp

    r156622 r156918  
    5353#endif
    5454
     55#if ENABLE(DISK_IMAGE_CACHE)
     56#include "DiskImageCacheIOS.h"
     57#endif
     58
    5559using std::max;
    5660
     
    533537}
    534538
     539#if ENABLE(DISK_IMAGE_CACHE)
     540bool CachedImage::canUseDiskImageCache() const
     541{
     542    if (isLoading() || errorOccurred())
     543        return false;
     544
     545    if (!m_data)
     546        return false;
     547
     548    if (isPurgeable())
     549        return false;
     550
     551    if (m_data->size() < diskImageCache().minimumImageSize())
     552        return false;
     553
     554    // "Cache-Control: no-store" resources may be marked as such because they may
     555    // contain sensitive information. We should not write these resources to disk.
     556    if (m_response.cacheControlContainsNoStore())
     557        return false;
     558
     559    // Testing shows that PDF images did not work when memory mapped.
     560    // However, SVG images and Bitmap images were fine. See:
     561    // <rdar://problem/8591834> Disk Image Cache should support PDF Images
     562    if (m_response.mimeType() == "application/pdf")
     563        return false;
     564
     565    return true;
     566}
     567
     568void CachedImage::useDiskImageCache()
     569{
     570    ASSERT(canUseDiskImageCache());
     571    ASSERT(!isUsingDiskImageCache());
     572    m_data->sharedBuffer()->allowToBeMemoryMapped();
     573}
     574#endif
     575
    535576} // namespace WebCore
  • trunk/Source/WebCore/loader/cache/CachedImage.h

    r156622 r156918  
    8080    static void resumeAnimatingImagesForLoader(CachedResourceLoader*);
    8181
     82#if ENABLE(DISK_IMAGE_CACHE)
     83    virtual bool canUseDiskImageCache() const OVERRIDE;
     84    virtual void useDiskImageCache() OVERRIDE;
     85#endif
     86
    8287private:
    8388    virtual void load(CachedResourceLoader*, const ResourceLoaderOptions&) OVERRIDE;
  • trunk/Source/WebCore/loader/cache/CachedResource.cpp

    r156550 r156918  
    827827bool CachedResource::isSafeToMakePurgeable() const
    828828{
     829#if ENABLE(DISK_IMAGE_CACHE)
     830    // It does not make sense to have a resource in the disk image cache
     831    // (memory mapped on disk) and purgeable (in memory). So do not allow
     832    // disk image cached resources to be purgeable.
     833    if (isUsingDiskImageCache())
     834        return false;
     835#endif
     836
    829837    return !hasClients() && !m_proxyResource && !m_resourceToRevalidate;
    830838}
     
    915923}
    916924
     925#if ENABLE(DISK_IMAGE_CACHE)
     926bool CachedResource::isUsingDiskImageCache() const
     927{
     928    return m_data && m_data->isUsingDiskImageCache();
     929}
     930#endif
     931
    917932#if PLATFORM(MAC)
    918933void CachedResource::tryReplaceEncodedData(PassRefPtr<SharedBuffer> newBuffer)
  • trunk/Source/WebCore/loader/cache/CachedResource.h

    r156550 r156918  
    250250    double loadFinishTime() const { return m_loadFinishTime; }
    251251
     252#if ENABLE(DISK_IMAGE_CACHE)
     253    bool isUsingDiskImageCache() const;
     254    virtual bool canUseDiskImageCache() const { return false; }
     255    virtual void useDiskImageCache() { ASSERT(canUseDiskImageCache()); }
     256#endif
     257
    252258    virtual bool canReuse(const ResourceRequest&) const { return true; }
    253259
  • trunk/Source/WebCore/loader/cache/MemoryCache.cpp

    r156550 r156918  
    4545#include <wtf/text/CString.h>
    4646
     47#if ENABLE(DISK_IMAGE_CACHE)
     48#include "DiskImageCacheIOS.h"
     49#include "ResourceBuffer.h"
     50#endif
     51
    4752using namespace std;
    4853
     
    379384}
    380385
     386#if ENABLE(DISK_IMAGE_CACHE)
     387void MemoryCache::flushCachedImagesToDisk()
     388{
     389    if (!diskImageCache().isEnabled())
     390        return;
     391
     392#ifndef NDEBUG
     393    double start = WTF::currentTimeMS();
     394    unsigned resourceCount = 0;
     395    unsigned cachedSize = 0;
     396#endif
     397
     398    for (size_t i = m_allResources.size(); i; ) {
     399        --i;
     400        CachedResource* current = m_allResources[i].m_tail;
     401        while (current) {
     402            CachedResource* previous = current->m_prevInAllResourcesList;
     403
     404            if (!current->isUsingDiskImageCache() && current->canUseDiskImageCache()) {
     405                current->useDiskImageCache();
     406                current->destroyDecodedData();
     407#ifndef NDEBUG
     408                LOG(DiskImageCache, "Cache::diskCacheResources(): attempting to save (%d) bytes", current->resourceBuffer()->sharedBuffer()->size());
     409                ++resourceCount;
     410                cachedSize += current->resourceBuffer()->sharedBuffer()->size();
     411#endif
     412            }
     413
     414            current = previous;
     415        }
     416    }
     417
     418#ifndef NDEBUG
     419    double end = WTF::currentTimeMS();
     420    LOG(DiskImageCache, "DiskImageCache: took (%f) ms to cache (%d) bytes for (%d) resources", end - start, cachedSize, resourceCount);
     421#endif
     422}
     423#endif // ENABLE(DISK_IMAGE_CACHE)
     424
    381425void MemoryCache::setCapacities(unsigned minDeadBytes, unsigned maxDeadBytes, unsigned totalBytes)
    382426{
     
    744788    purgeableSize += purgeable ? pageSize : 0;
    745789    purgedSize += purged ? pageSize : 0;
     790#if ENABLE(DISK_IMAGE_CACHE)
     791    // Only the data inside the resource was mapped, not the entire resource.
     792    mappedSize += o->isUsingDiskImageCache() ? o->resourceBuffer()->sharedBuffer()->size() : 0;
     793#endif
    746794}
    747795
     
    833881{
    834882    Statistics s = getStatistics();
     883#if ENABLE(DISK_IMAGE_CACHE)
     884    printf("%-13s %-13s %-13s %-13s %-13s %-13s %-13s %-13s %-13s\n", "", "Count", "Size", "LiveSize", "DecodedSize", "PurgeableSize", "PurgedSize", "Mapped", "\"Real\"");
     885    printf("%-13s %-13s %-13s %-13s %-13s %-13s %-13s %-13s %-13s\n", "-------------", "-------------", "-------------", "-------------", "-------------", "-------------", "-------------", "-------------", "-------------");
     886    printf("%-13s %13d %13d %13d %13d %13d %13d %13d %13d\n", "Images", s.images.count, s.images.size, s.images.liveSize, s.images.decodedSize, s.images.purgeableSize, s.images.purgedSize, s.images.mappedSize, s.images.size - s.images.mappedSize);
     887#else
    835888    printf("%-13s %-13s %-13s %-13s %-13s %-13s %-13s\n", "", "Count", "Size", "LiveSize", "DecodedSize", "PurgeableSize", "PurgedSize");
    836889    printf("%-13s %-13s %-13s %-13s %-13s %-13s %-13s\n", "-------------", "-------------", "-------------", "-------------", "-------------", "-------------", "-------------");
    837890    printf("%-13s %13d %13d %13d %13d %13d %13d\n", "Images", s.images.count, s.images.size, s.images.liveSize, s.images.decodedSize, s.images.purgeableSize, s.images.purgedSize);
     891#endif
    838892    printf("%-13s %13d %13d %13d %13d %13d %13d\n", "CSS", s.cssStyleSheets.count, s.cssStyleSheets.size, s.cssStyleSheets.liveSize, s.cssStyleSheets.decodedSize, s.cssStyleSheets.purgeableSize, s.cssStyleSheets.purgedSize);
    839893#if ENABLE(XSLT)
     
    847901void MemoryCache::dumpLRULists(bool includeLive) const
    848902{
     903#if ENABLE(DISK_IMAGE_CACHE)
     904    printf("LRU-SP lists in eviction order (Kilobytes decoded, Kilobytes encoded, Access count, Referenced, isPurgeable, wasPurged, isMemoryMapped):\n");
     905#else
    849906    printf("LRU-SP lists in eviction order (Kilobytes decoded, Kilobytes encoded, Access count, Referenced, isPurgeable, wasPurged):\n");
     907#endif
    850908
    851909    int size = m_allResources.size();
     
    856914            CachedResource* prev = current->m_prevInAllResourcesList;
    857915            if (includeLive || !current->hasClients())
     916#if ENABLE(DISK_IMAGE_CACHE)
     917                printf("(%.1fK, %.1fK, %uA, %dR, %d, %d, %d); ", current->decodedSize() / 1024.0f, (current->encodedSize() + current->overheadSize()) / 1024.0f, current->accessCount(), current->hasClients(), current->isPurgeable(), current->wasPurged(), current->isUsingDiskImageCache());
     918#else
    858919                printf("(%.1fK, %.1fK, %uA, %dR, %d, %d); ", current->decodedSize() / 1024.0f, (current->encodedSize() + current->overheadSize()) / 1024.0f, current->accessCount(), current->hasClients(), current->isPurgeable(), current->wasPurged());
     920#endif
    859921
    860922            current = prev;
  • trunk/Source/WebCore/loader/cache/MemoryCache.h

    r156550 r156918  
    101101        int purgeableSize;
    102102        int purgedSize;
     103#if ENABLE(DISK_IMAGE_CACHE)
     104        int mappedSize;
     105        TypeStatistic() : count(0), size(0), liveSize(0), decodedSize(0), purgeableSize(0), purgedSize(0), mappedSize(0) { }
     106#else
    103107        TypeStatistic() : count(0), size(0), liveSize(0), decodedSize(0), purgeableSize(0), purgedSize(0) { }
     108#endif
    104109        void addResource(CachedResource*);
    105110    };
     
    160165
    161166    static bool shouldMakeResourcePurgeableOnEviction();
     167
     168#if ENABLE(DISK_IMAGE_CACHE)
     169    void flushCachedImagesToDisk(); // Flush encoded data from resources still referenced by web pages.
     170#endif
    162171
    163172    static void removeUrlFromCache(ScriptExecutionContext*, const String& urlString);
  • trunk/Source/WebCore/platform/Logging.h

    r156205 r156918  
    4343    M(BackForward) \
    4444    M(Compositing) \
     45    M(DiskImageCache) \
    4546    M(Editing) \
    4647    M(Events) \
  • trunk/Source/WebCore/platform/SharedBuffer.cpp

    r156795 r156918  
    3333#include <wtf/unicode/Unicode.h>
    3434
     35#if ENABLE(DISK_IMAGE_CACHE)
     36#include "DiskImageCacheIOS.h"
     37#endif
     38
    3539using namespace std;
    3640
     
    6266SharedBuffer::SharedBuffer()
    6367    : m_size(0)
     68#if ENABLE(DISK_IMAGE_CACHE)
     69    , m_isMemoryMapped(false)
     70    , m_diskImageCacheId(DiskImageCache::invalidDiskCacheId)
     71    , m_notifyMemoryMappedCallback(nullptr)
     72    , m_notifyMemoryMappedCallbackData(nullptr)
     73#endif
    6474{
    6575}
     
    6878    : m_size(size)
    6979    , m_buffer(size)
     80#if ENABLE(DISK_IMAGE_CACHE)
     81    , m_isMemoryMapped(false)
     82    , m_diskImageCacheId(DiskImageCache::invalidDiskCacheId)
     83    , m_notifyMemoryMappedCallback(nullptr)
     84    , m_notifyMemoryMappedCallbackData(nullptr)
     85#endif
    7086{
    7187}
     
    7389SharedBuffer::SharedBuffer(const char* data, int size)
    7490    : m_size(0)
     91#if ENABLE(DISK_IMAGE_CACHE)
     92    , m_isMemoryMapped(false)
     93    , m_diskImageCacheId(DiskImageCache::invalidDiskCacheId)
     94    , m_notifyMemoryMappedCallback(nullptr)
     95    , m_notifyMemoryMappedCallbackData(nullptr)
     96#endif
    7597{
    7698    // FIXME: Use unsigned consistently, and check for invalid casts when calling into SharedBuffer from other code.
     
    83105SharedBuffer::SharedBuffer(const unsigned char* data, int size)
    84106    : m_size(0)
     107#if ENABLE(DISK_IMAGE_CACHE)
     108    , m_isMemoryMapped(false)
     109    , m_diskImageCacheId(DiskImageCache::invalidDiskCacheId)
     110    , m_notifyMemoryMappedCallback(nullptr)
     111    , m_notifyMemoryMappedCallbackData(nullptr)
     112#endif
    85113{
    86114    // FIXME: Use unsigned consistently, and check for invalid casts when calling into SharedBuffer from other code.
     
    93121SharedBuffer::~SharedBuffer()
    94122{
     123#if ENABLE(DISK_IMAGE_CACHE)
     124    if (m_diskImageCacheId) {
     125        diskImageCache().removeItem(m_diskImageCacheId);
     126        m_isMemoryMapped = false;
     127        m_diskImageCacheId = DiskImageCache::invalidDiskCacheId;
     128    }
     129#endif
    95130    clear();
    96131}
     
    123158}
    124159
     160#if ENABLE(DISK_IMAGE_CACHE)
     161bool SharedBuffer::isAllowedToBeMemoryMapped() const
     162{
     163    return m_diskImageCacheId != DiskImageCache::invalidDiskCacheId;
     164}
     165
     166SharedBuffer::MemoryMappingState SharedBuffer::allowToBeMemoryMapped()
     167{
     168    if (isMemoryMapped())
     169        return SharedBuffer::SuccessAlreadyMapped;
     170
     171    if (isAllowedToBeMemoryMapped())
     172        return SharedBuffer::PreviouslyQueuedForMapping;
     173
     174    m_diskImageCacheId = diskImageCache().writeItem(this);
     175    if (m_diskImageCacheId == DiskImageCache::invalidDiskCacheId)
     176        return SharedBuffer::FailureCacheFull;
     177
     178    return SharedBuffer::QueuedForMapping;
     179}
     180
     181void SharedBuffer::failedMemoryMap()
     182{
     183    if (m_notifyMemoryMappedCallback)
     184        m_notifyMemoryMappedCallback(this, SharedBuffer::Failed, m_notifyMemoryMappedCallbackData);
     185}
     186
     187void SharedBuffer::markAsMemoryMapped()
     188{
     189    ASSERT(!isMemoryMapped());
     190
     191    m_isMemoryMapped = true;
     192    unsigned savedSize = size();
     193    clear();
     194    m_size = savedSize;
     195
     196    if (m_notifyMemoryMappedCallback)
     197        m_notifyMemoryMappedCallback(this, SharedBuffer::Succeeded, m_notifyMemoryMappedCallbackData);
     198}
     199
     200SharedBuffer::MemoryMappedNotifyCallbackData SharedBuffer::memoryMappedNotificationCallbackData() const
     201{
     202    return m_notifyMemoryMappedCallbackData;
     203}
     204
     205SharedBuffer::MemoryMappedNotifyCallback SharedBuffer::memoryMappedNotificationCallback() const
     206{
     207    return m_notifyMemoryMappedCallback;
     208}
     209
     210void SharedBuffer::setMemoryMappedNotificationCallback(MemoryMappedNotifyCallback callback, MemoryMappedNotifyCallbackData data)
     211{
     212    ASSERT(!m_notifyMemoryMappedCallback || !callback);
     213    ASSERT(!m_notifyMemoryMappedCallbackData || !data);
     214
     215    m_notifyMemoryMappedCallback = callback;
     216    m_notifyMemoryMappedCallbackData = data;
     217}
     218#endif
     219
    125220void SharedBuffer::createPurgeableBuffer() const
    126221{
     
    141236const char* SharedBuffer::data() const
    142237{
     238#if ENABLE(DISK_IMAGE_CACHE)
     239    if (isMemoryMapped())
     240        return static_cast<const char*>(diskImageCache().dataForItem(m_diskImageCacheId));
     241#endif
     242
    143243    if (hasPlatformData())
    144244        return platformData();
     
    168268{
    169269    ASSERT(!m_purgeableBuffer);
     270#if ENABLE(DISK_IMAGE_CACHE)
     271    ASSERT(!isMemoryMapped());
     272#endif
    170273    if (!length)
    171274        return;
     
    266369const Vector<char>& SharedBuffer::buffer() const
    267370{
     371#if ENABLE(DISK_IMAGE_CACHE)
     372    ASSERT(!isMemoryMapped());
     373#endif
    268374    unsigned bufferSize = m_buffer.size();
    269375    if (m_size > bufferSize) {
     
    295401    }
    296402
     403#if ENABLE(DISK_IMAGE_CACHE)
     404    ASSERT(position < size());
     405    if (isMemoryMapped()) {
     406        const char* data = static_cast<const char*>(diskImageCache().dataForItem(m_diskImageCacheId));
     407        someData = data + position;
     408        return size() - position;
     409    }
     410#endif
     411
    297412    if (hasPlatformData() || m_purgeableBuffer) {
    298413        ASSERT_WITH_SECURITY_IMPLICATION(position < size());
  • trunk/Source/WebCore/platform/SharedBuffer.h

    r155641 r156918  
    131131    unsigned getSomeData(const char*& data, unsigned position = 0) const;
    132132
     133#if ENABLE(DISK_IMAGE_CACHE)
     134    enum MemoryMappingState { QueuedForMapping, PreviouslyQueuedForMapping, SuccessAlreadyMapped, FailureCacheFull };
     135
     136    // Calling this will cause this buffer to be memory mapped.
     137    MemoryMappingState allowToBeMemoryMapped();
     138    bool isAllowedToBeMemoryMapped() const;
     139
     140    // This is called to indicate that the memory mapping failed.
     141    void failedMemoryMap();
     142
     143    // This is called only once the buffer has been completely memory mapped.
     144    void markAsMemoryMapped();
     145    bool isMemoryMapped() const { return m_isMemoryMapped; }
     146
     147    // This callback function will be called when either the buffer has been memory mapped or failed to be memory mapped.
     148    enum CompletionStatus { Failed, Succeeded };
     149    typedef void* MemoryMappedNotifyCallbackData;
     150    typedef void (*MemoryMappedNotifyCallback)(PassRefPtr<SharedBuffer>, CompletionStatus, MemoryMappedNotifyCallbackData);
     151
     152    MemoryMappedNotifyCallbackData memoryMappedNotificationCallbackData() const;
     153    MemoryMappedNotifyCallback memoryMappedNotificationCallback() const;
     154    void setMemoryMappedNotificationCallback(MemoryMappedNotifyCallback, MemoryMappedNotifyCallbackData);
     155#endif
     156
    133157    void createPurgeableBuffer() const;
    134158
     
    163187    mutable Vector<char*> m_segments;
    164188#endif
     189#if ENABLE(DISK_IMAGE_CACHE)
     190    bool m_isMemoryMapped;
     191    unsigned m_diskImageCacheId; // DiskImageCacheId is unsigned.
     192    MemoryMappedNotifyCallback m_notifyMemoryMappedCallback;
     193    MemoryMappedNotifyCallbackData m_notifyMemoryMappedCallbackData;
     194#endif
    165195#if USE(CF)
    166196    explicit SharedBuffer(CFDataRef);
  • trunk/Source/WebCore/platform/cf/SharedBufferCF.cpp

    r155629 r156918  
    3131#include "PurgeableBuffer.h"
    3232
     33#if ENABLE(DISK_IMAGE_CACHE)
     34#include "DiskImageCacheIOS.h"
     35#endif
     36
    3337namespace WebCore {
    3438
     
    3640    : m_size(0)
    3741    , m_cfData(cfData)
     42#if ENABLE(DISK_IMAGE_CACHE)
     43    , m_isMemoryMapped(false)
     44    , m_diskImageCacheId(DiskImageCache::invalidDiskCacheId)
     45    , m_notifyMemoryMappedCallback(nullptr)
     46    , m_notifyMemoryMappedCallbackData(nullptr)
     47#endif
    3848{
    3949}
  • trunk/Source/WebKit/ChangeLog

    r156890 r156918  
     12013-10-04  Daniel Bates  <dabates@apple.com>
     2
     3        [iOS] Upstream disk image cache
     4        https://bugs.webkit.org/show_bug.cgi?id=121985
     5
     6        Reviewed by Joseph Pecoraro.
     7
     8        * WebKit.xcodeproj/project.pbxproj:
     9        * ios/WebCoreSupport/WebDiskImageCacheClientIOS.h: Added.
     10        * ios/WebCoreSupport/WebDiskImageCacheClientIOS.mm: Added.
     11
    1122013-10-04  Anders Carlsson  <andersca@apple.com>
    213
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r156890 r156918  
    364364                CDA62AE2125F87C2007FD118 /* WebFullScreenController.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA62AE0125F87C2007FD118 /* WebFullScreenController.h */; };
    365365                CDA62AE3125F87C2007FD118 /* WebFullScreenController.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDA62AE1125F87C2007FD118 /* WebFullScreenController.mm */; };
     366                A5C566BD127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = A5C566BB127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.h */; };
     367                A5C566BE127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = A5C566BC127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.mm */; };
    366368                CEDA12DB152CBE6800D9E08D /* WebAlternativeTextClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = CEDA12D9152CBE6800D9E08D /* WebAlternativeTextClient.mm */; };
    367369                CEDA12DC152CBE6800D9E08D /* WebAlternativeTextClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CEDA12DA152CBE6800D9E08D /* WebAlternativeTextClient.h */; };
     
    698700                CDA62AE0125F87C2007FD118 /* WebFullScreenController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebFullScreenController.h; sourceTree = "<group>"; };
    699701                CDA62AE1125F87C2007FD118 /* WebFullScreenController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebFullScreenController.mm; sourceTree = "<group>"; };
     702                A5C566BB127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebDiskImageCacheClientIOS.h; sourceTree = "<group>"; };
     703                A5C566BC127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebDiskImageCacheClientIOS.mm; sourceTree = "<group>"; };
    700704                CEDA12D9152CBE6800D9E08D /* WebAlternativeTextClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebAlternativeTextClient.mm; sourceTree = "<group>"; };
    701705                CEDA12DA152CBE6800D9E08D /* WebAlternativeTextClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAlternativeTextClient.h; sourceTree = "<group>"; };
     
    798802                                F5F732D202FF4D4F01A80180 /* WebKit.exp */,
    799803                                F5C283730284676D018635CA /* WebKitPrefix.h */,
     804                                FED1400A0CECCD6800D89466 /* ios */,
    800805                                6508A4A7099B375F00BCBF45 /* Default Delegates */,
    801806                                F57D194A034E732C01A80180 /* DOM */,
     
    12391244                        usesTabs = 0;
    12401245                };
     1246                FED1400A0CECCD6800D89466 /* ios */ = {
     1247                        isa = PBXGroup;
     1248                        children = (
     1249                                44A11FBE0EBA93B2009F69ED /* WebCoreSupport */,
     1250                        );
     1251                        path = ios;
     1252                        sourceTree = "<group>";
     1253                };
     1254                44A11FBE0EBA93B2009F69ED /* WebCoreSupport */ = {
     1255                        isa = PBXGroup;
     1256                        children = (
     1257                                A5C566BB127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.h */,
     1258                                A5C566BC127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.mm */,
     1259                        );
     1260                        path = WebCoreSupport;
     1261                        sourceTree = "<group>";
     1262                };
    12411263                F52CA6BD02DF9D0F018635CA /* HTML */ = {
    12421264                        isa = PBXGroup;
     
    14241446                                1A60519417502A5D00BC62F5 /* HistoryPropertyList.h in Headers */,
    14251447                                939810680824BF01008DF038 /* HIViewAdapter.h in Headers */,
     1448                                A5C566BD127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.h in Headers */,
    14261449                                070F549B17F1E42B00169E04 /* WebUserMediaClient.h in Headers */,
    14271450                                939810690824BF01008DF038 /* HIWebView.h in Headers */,
     
    19571980                                1C68F670095B5FC100C2984E /* WebNodeHighlight.mm in Sources */,
    19581981                                A5687BDB135B791A0074CBCB /* WebNodeHighlighter.mm in Sources */,
     1982                                A5C566BE127A3AE500E8A3FF /* WebDiskImageCacheClientIOS.mm in Sources */,
    19591983                                1C68F672095B5FC100C2984E /* WebNodeHighlightView.mm in Sources */,
    19601984                                312E2FE614E48182007CCA18 /* WebNotification.mm in Sources */,
  • trunk/Source/WebKit/mac/ChangeLog

    r156890 r156918  
     12013-10-04  Daniel Bates  <dabates@apple.com>
     2
     3        [iOS] Upstream disk image cache
     4        https://bugs.webkit.org/show_bug.cgi?id=121985
     5
     6        Reviewed by Joseph Pecoraro.
     7
     8        * Misc/WebCache.mm:
     9        (+[WebCache statistics]):
     10        * WebView/WebDataSource.mm:
     11        (BufferMemoryMapped): Added.
     12        (-[WebDataSource _setAllowToBeMemoryMapped]): Added.
     13        (-[WebDataSource setDataSourceDelegate:]): Added.
     14        (-[WebDataSource dataSourceDelegate]): Added.
     15        (-[WebDataSource dealloc]):
     16        * WebView/WebDataSourcePrivate.h: Declared private delegate
     17        protocol, WebDataSourcePrivateDelegate.
     18        * WebView/WebPreferenceKeysPrivate.h:
     19        * WebView/WebPreferences.mm:
     20        (+[WebPreferences initialize]):
     21        (-[WebPreferences diskImageCacheEnabled]): Added.
     22        (-[WebPreferences setDiskImageCacheEnabled:]): Added.
     23        (-[WebPreferences diskImageCacheMinimumImageSize]): Added.
     24        (-[WebPreferences setDiskImageCacheMinimumImageSize:]): Added.
     25        (-[WebPreferences diskImageCacheMaximumCacheSize]): Added.
     26        (-[WebPreferences setDiskImageCacheMaximumCacheSize:]): Added.
     27        (-[WebPreferences _diskImageCacheSavedCacheDirectory]): Added.
     28        (-[WebPreferences _setDiskImageCacheSavedCacheDirectory:]): Added.
     29        * WebView/WebView.mm:
     30        (-[WebView _commonInitializationWithFrameName:groupName:]):
     31        (-[WebView _preferencesChanged:]):
     32
    1332013-10-04  Anders Carlsson  <andersca@apple.com>
    234
  • trunk/Source/WebKit/mac/Misc/WebCache.mm

    r147363 r156918  
    113113            [NSNumber numberWithInt:s.scripts.purgedSize], @"JavaScript",
    114114            nil],
     115#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     116        [NSDictionary dictionaryWithObjectsAndKeys:
     117            [NSNumber numberWithInt:s.images.mappedSize], @"Images",
     118            [NSNumber numberWithInt:s.cssStyleSheets.mappedSize] ,@"CSS",
     119#if ENABLE(XSLT)
     120            [NSNumber numberWithInt:s.xslStyleSheets.mappedSize], @"XSL",
     121#else
     122            [NSNumber numberWithInt:0], @"XSL",
     123#endif
     124            [NSNumber numberWithInt:s.scripts.mappedSize], @"JavaScript",
     125            nil],
     126#endif // ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
    115127        nil];
    116128}
  • trunk/Source/WebKit/mac/WebView/WebDataSource.mm

    r156550 r156918  
    9898}
    9999
     100#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     101static void BufferMemoryMapped(PassRefPtr<SharedBuffer> buffer, SharedBuffer::CompletionStatus mapStatus, SharedBuffer::MemoryMappedNotifyCallbackData data)
     102{
     103    NSObject<WebDataSourcePrivateDelegate> *delegate = [(WebDataSource *)data dataSourceDelegate];
     104    if (mapStatus == SharedBuffer::Succeeded)
     105        [delegate dataSourceMemoryMapped];
     106    else
     107        [delegate dataSourceMemoryMapFailed];
     108}
     109#endif
     110
    100111@interface WebDataSource (WebFileInternal)
    101112@end
     
    197208    toPrivate(_private)->loader->setDeferMainResourceDataLoad(flag);
    198209}
     210
     211#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     212- (void)_setAllowToBeMemoryMapped
     213{
     214    RefPtr<ResourceBuffer> mainResourceBuffer = toPrivate(_private)->loader->mainResourceData();
     215    if (!mainResourceBuffer)
     216        return;
     217
     218    RefPtr<SharedBuffer> mainResourceData = mainResourceBuffer->sharedBuffer();
     219    if (!mainResourceData)
     220        return;
     221
     222    if (mainResourceData->memoryMappedNotificationCallback() != BufferMemoryMapped) {
     223        ASSERT(!mainResourceData->memoryMappedNotificationCallback() && !mainResourceData->memoryMappedNotificationCallbackData());
     224        mainResourceData->setMemoryMappedNotificationCallback(BufferMemoryMapped, self);
     225    }
     226
     227    switch (mainResourceData->allowToBeMemoryMapped()) {
     228    case SharedBuffer::SuccessAlreadyMapped:
     229        [[self dataSourceDelegate] dataSourceMemoryMapped];
     230        return;
     231    case SharedBuffer::PreviouslyQueuedForMapping:
     232    case SharedBuffer::QueuedForMapping:
     233        return;
     234    case SharedBuffer::FailureCacheFull:
     235        [[self dataSourceDelegate] dataSourceMemoryMapFailed];
     236        return;
     237    }
     238    ASSERT_NOT_REACHED();
     239}
     240
     241- (void)setDataSourceDelegate:(NSObject<WebDataSourcePrivateDelegate> *)delegate
     242{
     243    ASSERT(!toPrivate(_private)->_dataSourceDelegate);
     244    toPrivate(_private)->_dataSourceDelegate = delegate;
     245}
     246
     247- (NSObject<WebDataSourcePrivateDelegate> *)dataSourceDelegate
     248{
     249    return toPrivate(_private)->_dataSourceDelegate;
     250}
     251#endif // ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
    199252
    200253@end
     
    384437        --WebDataSourceCount;
    385438
     439#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     440    if (_private) {
     441        RefPtr<ResourceBuffer> mainResourceBuffer = toPrivate(_private)->loader->mainResourceData();
     442        if (mainResourceBuffer) {
     443            RefPtr<SharedBuffer> mainResourceData = mainResourceBuffer->sharedBuffer();
     444            if (mainResourceData &&
     445                mainResourceData->memoryMappedNotificationCallbackData() == self &&
     446                mainResourceData->memoryMappedNotificationCallback() == BufferMemoryMapped) {
     447                mainResourceData->setMemoryMappedNotificationCallback(nullptr, nullptr);
     448            }
     449        }
     450    }
     451#endif
     452
    386453    delete toPrivate(_private);
    387454
  • trunk/Source/WebKit/mac/WebView/WebDataSourcePrivate.h

    r63191 r156918  
    2929#import <WebKit/WebDataSource.h>
    3030
     31#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     32@protocol WebDataSourcePrivateDelegate
     33@required
     34- (void)dataSourceMemoryMapped;
     35- (void)dataSourceMemoryMapFailed;
     36@end
     37#endif
     38
    3139@interface WebDataSource (WebPrivate)
    3240
     
    4048- (void)_setDeferMainResourceDataLoad:(BOOL)flag;
    4149
     50#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     51- (void)_setAllowToBeMemoryMapped;
     52- (void)setDataSourceDelegate:(NSObject<WebDataSourcePrivateDelegate> *)dataSourceDelegate;
     53- (NSObject<WebDataSourcePrivateDelegate> *)dataSourceDelegate;
     54#endif
     55
    4256@end
  • trunk/Source/WebKit/mac/WebView/WebPreferenceKeysPrivate.h

    r155496 r156918  
    162162
    163163#define WebKitMinimumZoomFontSizePreferenceKey @"WebKitMinimumZoomFontSizePreferenceKey"
     164
     165#define WebKitDiskImageCacheEnabledPreferenceKey @"WebKitDiskImageCacheEnabled"
     166#define WebKitDiskImageCacheMinimumImageSizePreferenceKey @"WebKitDiskImageCacheMinimumImageSize"
     167#define WebKitDiskImageCacheMaximumCacheSizePreferenceKey @"WebKitDiskImageCacheMaximumCacheSize"
     168#define WebKitDiskImageCacheSavedCacheDirectoryKey @"WebKitDiskImageCacheSavedCacheDirectory"
  • trunk/Source/WebKit/mac/WebView/WebPreferences.mm

    r155496 r156918  
    417417        [NSNumber numberWithFloat:WKGetMinimumZoomFontSize()], WebKitMinimumZoomFontSizePreferenceKey,
    418418#endif
     419#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     420        [NSNumber numberWithBool:YES], WebKitDiskImageCacheEnabledPreferenceKey,
     421        [NSNumber numberWithUnsignedInt:(100 * 1024)], WebKitDiskImageCacheMinimumImageSizePreferenceKey,
     422        [NSNumber numberWithUnsignedInt:(100 * 1024 * 1024)], WebKitDiskImageCacheMaximumCacheSizePreferenceKey,
     423#endif
    419424        [NSNumber numberWithLongLong:ApplicationCacheStorage::noQuota()], WebKitApplicationCacheTotalQuota,
    420425        [NSNumber numberWithLongLong:ApplicationCacheStorage::noQuota()], WebKitApplicationCacheDefaultOriginQuota,
     
    14881493}
    14891494
     1495#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     1496- (BOOL)diskImageCacheEnabled
     1497{
     1498    return [self _boolValueForKey:WebKitDiskImageCacheEnabledPreferenceKey];
     1499}
     1500
     1501- (void)setDiskImageCacheEnabled:(BOOL)enabled
     1502{
     1503    [self _setBoolValue:enabled forKey:WebKitDiskImageCacheEnabledPreferenceKey];
     1504}
     1505
     1506- (unsigned)diskImageCacheMinimumImageSize
     1507{
     1508    return [self _integerValueForKey:WebKitDiskImageCacheMinimumImageSizePreferenceKey];
     1509}
     1510
     1511- (void)setDiskImageCacheMinimumImageSize:(unsigned)minimumSize
     1512{
     1513    [self _setIntegerValue:minimumSize forKey:WebKitDiskImageCacheMinimumImageSizePreferenceKey];
     1514}
     1515
     1516- (unsigned)diskImageCacheMaximumCacheSize
     1517{
     1518    return [self _integerValueForKey:WebKitDiskImageCacheMaximumCacheSizePreferenceKey];
     1519}
     1520
     1521- (void)setDiskImageCacheMaximumCacheSize:(unsigned)maximumSize
     1522{
     1523    [self _setIntegerValue:maximumSize forKey:WebKitDiskImageCacheMaximumCacheSizePreferenceKey];
     1524}
     1525
     1526- (NSString *)_diskImageCacheSavedCacheDirectory
     1527{
     1528    return [[self _stringValueForKey:WebKitDiskImageCacheSavedCacheDirectoryKey] stringByStandardizingPath];
     1529}
     1530
     1531- (void)_setDiskImageCacheSavedCacheDirectory:(NSString *)path
     1532{
     1533    [self _setStringValue:[path stringByStandardizingPath] forKey:WebKitDiskImageCacheSavedCacheDirectoryKey];
     1534}
     1535#endif // ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     1536
    14901537- (BOOL)isFrameFlatteningEnabled
    14911538{
  • trunk/Source/WebKit/mac/WebView/WebView.mm

    r156769 r156918  
    207207#endif
    208208
     209#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     210#import "WebDiskImageCacheClientIOS.h"
     211#import <WebCore/DiskImageCacheIOS.h>
     212#endif
     213
    209214#if USE(GLIB)
    210215#import <glib.h>
     
    740745        WebKitInitializeStorageIfNecessary();
    741746        WebKitInitializeApplicationCachePathIfNecessary();
     747#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     748        WebKitInitializeWebDiskImageCache();
     749#endif
    742750       
    743751        Settings::setDefaultMinDOMTimerInterval(0.004);
     
    16051613    if (_private->zoomsTextOnly != zoomsTextOnly)
    16061614        [self _setZoomMultiplier:_private->zoomMultiplier isTextOnly:zoomsTextOnly];
     1615
     1616#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
     1617    DiskImageCache& diskImageCache = WebCore::diskImageCache();
     1618    diskImageCache.setEnabled([preferences diskImageCacheEnabled]);
     1619    diskImageCache.setMinimumImageSize([preferences diskImageCacheMinimumImageSize]);
     1620    diskImageCache.setMaximumCacheSize([preferences diskImageCacheMaximumCacheSize]);
     1621#endif
    16071622}
    16081623
Note: See TracChangeset for help on using the changeset viewer.