Chromium Code Reviews| 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()); |