Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(44)

Side by Side Diff: Source/core/loader/cache/CachedResourceLoader.cpp

Issue 16433002: Prepopulate the memoryCache with data:uri images. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address reviewer comments Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/loader/cache/CachedResourceLoader.h ('k') | public/platform/Platform.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #include "core/loader/PingLoader.h" 43 #include "core/loader/PingLoader.h"
44 #include "core/loader/UniqueIdentifier.h" 44 #include "core/loader/UniqueIdentifier.h"
45 #include "core/loader/cache/CachedCSSStyleSheet.h" 45 #include "core/loader/cache/CachedCSSStyleSheet.h"
46 #include "core/loader/cache/CachedDocument.h" 46 #include "core/loader/cache/CachedDocument.h"
47 #include "core/loader/cache/CachedFont.h" 47 #include "core/loader/cache/CachedFont.h"
48 #include "core/loader/cache/CachedImage.h" 48 #include "core/loader/cache/CachedImage.h"
49 #include "core/loader/cache/CachedRawResource.h" 49 #include "core/loader/cache/CachedRawResource.h"
50 #include "core/loader/cache/CachedResourceRequest.h" 50 #include "core/loader/cache/CachedResourceRequest.h"
51 #include "core/loader/cache/CachedScript.h" 51 #include "core/loader/cache/CachedScript.h"
52 #include "core/loader/cache/CachedShader.h" 52 #include "core/loader/cache/CachedShader.h"
53 #include "core/loader/cache/CachedTextTrack.h"
53 #include "core/loader/cache/CachedXSLStyleSheet.h" 54 #include "core/loader/cache/CachedXSLStyleSheet.h"
54 #include "core/loader/cache/MemoryCache.h" 55 #include "core/loader/cache/MemoryCache.h"
55 #include "core/page/Console.h" 56 #include "core/page/Console.h"
56 #include "core/page/ContentSecurityPolicy.h" 57 #include "core/page/ContentSecurityPolicy.h"
57 #include "core/page/DOMWindow.h" 58 #include "core/page/DOMWindow.h"
58 #include "core/page/Frame.h" 59 #include "core/page/Frame.h"
59 #include "core/page/Performance.h" 60 #include "core/page/Performance.h"
60 #include "core/page/Settings.h" 61 #include "core/page/Settings.h"
61 #include "core/platform/Logging.h" 62 #include "core/platform/Logging.h"
63 #include "public/platform/Platform.h"
64 #include "public/platform/WebURL.h"
62 #include "weborigin/SecurityOrigin.h" 65 #include "weborigin/SecurityOrigin.h"
63 #include "weborigin/SecurityPolicy.h" 66 #include "weborigin/SecurityPolicy.h"
64 67
65 #include "core/loader/cache/CachedTextTrack.h"
66
67 #define PRELOAD_DEBUG 0 68 #define PRELOAD_DEBUG 0
68 69
69 namespace WebCore { 70 namespace WebCore {
70 71
71 static CachedResource* createResource(CachedResource::Type type, ResourceRequest & request, const String& charset) 72 static CachedResource* createResource(CachedResource::Type type, ResourceRequest & request, const String& charset)
72 { 73 {
73 switch (type) { 74 switch (type) {
74 case CachedResource::ImageResource: 75 case CachedResource::ImageResource:
75 return new CachedImage(request); 76 return new CachedImage(request);
76 case CachedResource::CSSStyleSheet: 77 case CachedResource::CSSStyleSheet:
(...skipping 15 matching lines...) Expand all
92 return new CachedResource(request, CachedResource::LinkSubresource); 93 return new CachedResource(request, CachedResource::LinkSubresource);
93 case CachedResource::TextTrackResource: 94 case CachedResource::TextTrackResource:
94 return new CachedTextTrack(request); 95 return new CachedTextTrack(request);
95 case CachedResource::ShaderResource: 96 case CachedResource::ShaderResource:
96 return new CachedShader(request); 97 return new CachedShader(request);
97 } 98 }
98 ASSERT_NOT_REACHED(); 99 ASSERT_NOT_REACHED();
99 return 0; 100 return 0;
100 } 101 }
101 102
103 static CachedResource* resourceFromDataURIRequest(ResourceRequest& request)
104 {
105 const KURL& url = request.url();
106 ASSERT(url.protocolIsData());
107
108 WebKit::WebString mimetype;
109 WebKit::WebString charset;
110 RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(WebKit::Platform::curre nt()->parseDataURL(url, mimetype, charset));
111 if (!data)
112 return 0;
113 ResourceResponse response(url, mimetype, data->size(), charset, String());
114
115 CachedResource* resource = createResource(CachedResource::ImageResource, req uest, charset);
abarth-chromium 2013/06/07 20:36:11 We'll eventually want to expand this beyond just i
116 resource->responseReceived(response);
117 // FIXME: AppendData caises an unnecessary memcpy.
abarth-chromium 2013/06/07 20:36:11 caises -> causes
pdr. 2013/06/07 22:00:23 Done.
118 if (data->size())
119 resource->appendData(data->data(), data->size());
120 resource->finish();
121 return resource;
122 }
123
102 CachedResourceLoader::CachedResourceLoader(DocumentLoader* documentLoader) 124 CachedResourceLoader::CachedResourceLoader(DocumentLoader* documentLoader)
103 : m_document(0) 125 : m_document(0)
104 , m_documentLoader(documentLoader) 126 , m_documentLoader(documentLoader)
105 , m_requestCount(0) 127 , m_requestCount(0)
106 , m_garbageCollectDocumentResourcesTimer(this, &CachedResourceLoader::garbag eCollectDocumentResourcesTimerFired) 128 , m_garbageCollectDocumentResourcesTimer(this, &CachedResourceLoader::garbag eCollectDocumentResourcesTimerFired)
107 , m_autoLoadImages(true) 129 , m_autoLoadImages(true)
108 , m_imagesEnabled(true) 130 , m_imagesEnabled(true)
109 , m_allowStaleResources(false) 131 , m_allowStaleResources(false)
110 { 132 {
111 } 133 }
(...skipping 29 matching lines...) Expand all
141 CachedResourceHandle<CachedImage> CachedResourceLoader::requestImage(CachedResou rceRequest& request) 163 CachedResourceHandle<CachedImage> CachedResourceLoader::requestImage(CachedResou rceRequest& request)
142 { 164 {
143 if (Frame* f = frame()) { 165 if (Frame* f = frame()) {
144 if (f->loader()->pageDismissalEventBeingDispatched() != FrameLoader::NoD ismissal) { 166 if (f->loader()->pageDismissalEventBeingDispatched() != FrameLoader::NoD ismissal) {
145 KURL requestURL = request.resourceRequest().url(); 167 KURL requestURL = request.resourceRequest().url();
146 if (requestURL.isValid() && canRequest(CachedResource::ImageResource , requestURL, CheckContentSecurityPolicy)) 168 if (requestURL.isValid() && canRequest(CachedResource::ImageResource , requestURL, CheckContentSecurityPolicy))
147 PingLoader::loadImage(f, requestURL); 169 PingLoader::loadImage(f, requestURL);
148 return 0; 170 return 0;
149 } 171 }
150 } 172 }
173
174 if (request.resourceRequest().url().protocolIsData())
175 preCacheDataURIImage(request);
176
151 request.setDefer(clientDefersImage(request.resourceRequest().url()) ? Cached ResourceRequest::DeferredByClient : CachedResourceRequest::NoDefer); 177 request.setDefer(clientDefersImage(request.resourceRequest().url()) ? Cached ResourceRequest::DeferredByClient : CachedResourceRequest::NoDefer);
152 return static_cast<CachedImage*>(requestResource(CachedResource::ImageResour ce, request).get()); 178 return static_cast<CachedImage*>(requestResource(CachedResource::ImageResour ce, request).get());
153 } 179 }
154 180
181 void CachedResourceLoader::preCacheDataURIImage(CachedResourceRequest& request)
182 {
183 const KURL& url = request.resourceRequest().url();
184 ASSERT(url.protocolIsData());
185
186 if (CachedResource* existing = memoryCache()->resourceForURL(url)) {
187 if (existing->type() == CachedResource::ImageResource)
188 return;
189 memoryCache()->remove(existing); // Cache entry is incorrect.
abarth-chromium 2013/06/07 20:36:11 Is there a test for this case?
pdr. 2013/06/07 22:00:23 I don't think a test can hit this codepath. I trie
190 }
191
192 if (CachedResource* resource = resourceFromDataURIRequest(request.mutableRes ourceRequest()))
abarth-chromium 2013/06/07 20:36:11 Why does this need to be mutable? It doesn't seem
pdr. 2013/06/07 22:00:23 Nope! Required some minor fixups to make this true
193 memoryCache()->add(resource);
194 }
195
155 CachedResourceHandle<CachedFont> CachedResourceLoader::requestFont(CachedResourc eRequest& request) 196 CachedResourceHandle<CachedFont> CachedResourceLoader::requestFont(CachedResourc eRequest& request)
156 { 197 {
157 return static_cast<CachedFont*>(requestResource(CachedResource::FontResource , request).get()); 198 return static_cast<CachedFont*>(requestResource(CachedResource::FontResource , request).get());
158 } 199 }
159 200
160 CachedResourceHandle<CachedTextTrack> CachedResourceLoader::requestTextTrack(Cac hedResourceRequest& request) 201 CachedResourceHandle<CachedTextTrack> CachedResourceLoader::requestTextTrack(Cac hedResourceRequest& request)
161 { 202 {
162 return static_cast<CachedTextTrack*>(requestResource(CachedResource::TextTra ckResource, request).get()); 203 return static_cast<CachedTextTrack*>(requestResource(CachedResource::TextTra ckResource, request).get());
163 } 204 }
164 205
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
1027 info.addMember(m_garbageCollectDocumentResourcesTimer, "garbageCollectDocume ntResourcesTimer"); 1068 info.addMember(m_garbageCollectDocumentResourcesTimer, "garbageCollectDocume ntResourcesTimer");
1028 } 1069 }
1029 1070
1030 const ResourceLoaderOptions& CachedResourceLoader::defaultCachedResourceOptions( ) 1071 const ResourceLoaderOptions& CachedResourceLoader::defaultCachedResourceOptions( )
1031 { 1072 {
1032 static ResourceLoaderOptions options(SendCallbacks, SniffContent, BufferData , AllowStoredCredentials, ClientRequestedCredentials, AskClientForCrossOriginCre dentials, DoSecurityCheck, CheckContentSecurityPolicy); 1073 static ResourceLoaderOptions options(SendCallbacks, SniffContent, BufferData , AllowStoredCredentials, ClientRequestedCredentials, AskClientForCrossOriginCre dentials, DoSecurityCheck, CheckContentSecurityPolicy);
1033 return options; 1074 return options;
1034 } 1075 }
1035 1076
1036 } 1077 }
OLDNEW
« no previous file with comments | « Source/core/loader/cache/CachedResourceLoader.h ('k') | public/platform/Platform.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698