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()); |