 Chromium Code Reviews
 Chromium Code Reviews Issue 16433002:
  Prepopulate the memoryCache with data:uri images.  (Closed) 
  Base URL: svn://svn.chromium.org/blink/trunk
    
  
    Issue 16433002:
  Prepopulate the memoryCache with data:uri images.  (Closed) 
  Base URL: svn://svn.chromium.org/blink/trunk| Index: Source/core/loader/cache/CachedResourceLoader.cpp | 
| diff --git a/Source/core/loader/cache/CachedResourceLoader.cpp b/Source/core/loader/cache/CachedResourceLoader.cpp | 
| index b5ca77c14353e4b5fd59767861482c1cb8e02bd3..0305f6406038f1908cb1e12da19b96afb367c1e9 100644 | 
| --- a/Source/core/loader/cache/CachedResourceLoader.cpp | 
| +++ b/Source/core/loader/cache/CachedResourceLoader.cpp | 
| @@ -50,6 +50,7 @@ | 
| #include "core/loader/cache/CachedResourceRequest.h" | 
| #include "core/loader/cache/CachedScript.h" | 
| #include "core/loader/cache/CachedShader.h" | 
| +#include "core/loader/cache/CachedTextTrack.h" | 
| #include "core/loader/cache/CachedXSLStyleSheet.h" | 
| #include "core/loader/cache/MemoryCache.h" | 
| #include "core/page/Console.h" | 
| @@ -59,11 +60,11 @@ | 
| #include "core/page/Performance.h" | 
| #include "core/page/Settings.h" | 
| #include "core/platform/Logging.h" | 
| +#include "public/platform/Platform.h" | 
| +#include "public/platform/WebURL.h" | 
| #include "weborigin/SecurityOrigin.h" | 
| #include "weborigin/SecurityPolicy.h" | 
| -#include "core/loader/cache/CachedTextTrack.h" | 
| - | 
| #define PRELOAD_DEBUG 0 | 
| namespace WebCore { | 
| @@ -99,6 +100,26 @@ static CachedResource* createResource(CachedResource::Type type, ResourceRequest | 
| return 0; | 
| } | 
| +static CachedResource* resourceFromDataURIRequest(ResourceRequest& request) | 
| +{ | 
| + KURL url = request.url(); | 
| 
abarth-chromium
2013/06/05 23:42:51
this can be a const KURL& rather than a KURL
 
pdr.
2013/06/05 23:53:25
Done.
 | 
| + ASSERT(url.protocolIsData()); | 
| + | 
| + WebKit::WebString mimetype; | 
| + WebKit::WebString charset; | 
| + RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(WebKit::Platform::current()->parseDataURL(url, mimetype, charset)); | 
| + if (!data || !data->size()) | 
| 
abarth-chromium
2013/06/05 23:42:51
Checking the size here doesn't seem right.  It's b
 
pdr.
2013/06/05 23:53:25
Done.
 | 
| + return 0; | 
| + ResourceResponse response(url, mimetype, data->size(), charset, String()); | 
| + | 
| + CachedResource* resource = createResource(CachedResource::ImageResource, request, charset); | 
| + resource->responseReceived(response); | 
| + // FIXME: This is an unnecessary memcpy. | 
| + resource->appendData(data->data(), data->size()); | 
| + resource->finish(); | 
| + return resource; | 
| +} | 
| + | 
| CachedResourceLoader::CachedResourceLoader(DocumentLoader* documentLoader) | 
| : m_document(0) | 
| , m_documentLoader(documentLoader) | 
| @@ -148,10 +169,29 @@ CachedResourceHandle<CachedImage> CachedResourceLoader::requestImage(CachedResou | 
| return 0; | 
| } | 
| } | 
| + | 
| + if (request.resourceRequest().url().protocolIsData()) | 
| + preCacheDataURIImage(request); | 
| 
Nate Chapin
2013/06/05 23:50:54
Should this early return? Otherwise, won't we run
 
pdr.
2013/06/05 23:53:25
That's the idea: we pre-populate the memory cache
 | 
| + | 
| request.setDefer(clientDefersImage(request.resourceRequest().url()) ? CachedResourceRequest::DeferredByClient : CachedResourceRequest::NoDefer); | 
| return static_cast<CachedImage*>(requestResource(CachedResource::ImageResource, request).get()); | 
| } | 
| +void CachedResourceLoader::preCacheDataURIImage(CachedResourceRequest& request) | 
| +{ | 
| + KURL url = request.resourceRequest().url(); | 
| 
abarth-chromium
2013/06/05 23:42:51
const KURL&
 
pdr.
2013/06/05 23:53:25
Done.
 | 
| + ASSERT(url.protocolIsData()); | 
| + | 
| + if (CachedResource* existing = memoryCache()->resourceForURL(url)) { | 
| + if (existing->type() == CachedResource::ImageResource) | 
| + return; | 
| + memoryCache()->remove(existing); // Cache entry is incorrect. | 
| + } | 
| + | 
| + if (CachedResource* resource = resourceFromDataURIRequest(request.mutableResourceRequest())) | 
| + memoryCache()->add(resource); | 
| +} | 
| + | 
| CachedResourceHandle<CachedFont> CachedResourceLoader::requestFont(CachedResourceRequest& request) | 
| { | 
| return static_cast<CachedFont*>(requestResource(CachedResource::FontResource, request).get()); |