Changeset 104756 in webkit
- Timestamp:
- Jan 11, 2012 3:54:28 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r104755 r104756 1 2012-01-11 Nate Chapin <japhet@chromium.org> 2 3 SubresourceLoader cleanup post r100311. 4 1. Simplify matching incrementRequestCount()/decrementRequestCount() calls. 5 2. Remove CachedImage custom code from SubresourceLoader. 6 3. Add a bunch of ASSERTs. 7 4. Remove the multipart-only call to didReceiveData() from didReceiveResponse(), 8 since didReceiveData() would get called immediately after anyway. 9 https://bugs.webkit.org/show_bug.cgi?id=75887 10 11 Reviewed by Adam Barth. 12 13 No new tests, refactor only. 14 15 * loader/SubresourceLoader.cpp: 16 (WebCore::SubresourceLoader::didReceiveResponse): Remove multipart special case, handle it in didReceiveData(). 17 (WebCore::SubresourceLoader::didReceiveData): Handle multipart state here, since we will receive only one 18 didReceiveData() call per multipart segment, but no didFinishLoading() call. 19 * loader/SubresourceLoader.h: Add a RequestCountTracker subclass to reduce complexity of ensuring we don't 20 decrement request count twice on CachedResourceLoader. 21 * loader/cache/CachedImage.cpp: 22 (WebCore::CachedImage::setResponse): Move CachedImage::clear() call out of SubresourceLoader, since it's 23 kind of a layering violation as is. 24 * loader/cache/CachedImage.h: 25 * loader/cache/CachedResource.cpp: 26 1 27 2012-01-11 Joshua Bell <jsbell@chromium.org> 2 28 -
trunk/Source/WebCore/loader/SubresourceLoader.cpp
r104407 r104756 30 30 #include "SubresourceLoader.h" 31 31 32 #include "CachedImage.h"33 32 #include "CachedResourceLoader.h" 34 33 #include "Document.h" … … 48 47 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, subresourceLoaderCounter, ("SubresourceLoader")); 49 48 49 SubresourceLoader::RequestCountTracker::RequestCountTracker(CachedResourceLoader* cachedResourceLoader, CachedResource* resource) 50 : m_cachedResourceLoader(cachedResourceLoader) 51 , m_resource(resource) 52 { 53 m_cachedResourceLoader->incrementRequestCount(m_resource); 54 } 55 56 SubresourceLoader::RequestCountTracker::~RequestCountTracker() 57 { 58 m_cachedResourceLoader->decrementRequestCount(m_resource); 59 } 60 50 61 SubresourceLoader::SubresourceLoader(Frame* frame, CachedResource* resource, const ResourceLoaderOptions& options) 51 62 : ResourceLoader(frame, options) … … 54 65 , m_loadingMultipartContent(false) 55 66 , m_state(Uninitialized) 67 , m_requestCountTracker(adoptPtr(new RequestCountTracker(frame->document()->cachedResourceLoader(), resource))) 56 68 { 57 69 #ifndef NDEBUG … … 62 74 SubresourceLoader::~SubresourceLoader() 63 75 { 76 ASSERT(m_state != Initialized); 77 ASSERT(!m_document); 78 ASSERT(reachedTerminalState()); 64 79 #ifndef NDEBUG 65 80 subresourceLoaderCounter.decrement(); … … 120 135 return false; 121 136 137 ASSERT(!reachedTerminalState()); 122 138 m_state = Initialized; 123 139 m_documentLoader->addSubresourceLoader(this); … … 142 158 void SubresourceLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) 143 159 { 160 ASSERT(m_state == Initialized); 144 161 RefPtr<SubresourceLoader> protect(this); 145 162 m_resource->didSendData(bytesSent, totalBytesToBeSent); … … 149 166 { 150 167 ASSERT(!response.isNull()); 168 ASSERT(m_state == Initialized); 151 169 152 170 // Reference the object in this method since the additional processing can do … … 175 193 ResourceLoader::didReceiveResponse(response); 176 194 177 if (m_loadingMultipartContent) { 178 ASSERT(m_resource->isImage()); 179 static_cast<CachedImage*>(m_resource)->clear(); 180 } else if (response.isMultipart()) { 195 if (response.isMultipart()) { 181 196 m_loadingMultipartContent = true; 182 197 183 198 // We don't count multiParts in a CachedResourceLoader's request count 184 m_document->cachedResourceLoader()->decrementRequestCount(m_resource); 199 m_requestCountTracker.clear(); 200 setShouldBufferData(DoNotBufferData); 185 201 if (!m_resource->isImage()) { 186 202 cancel(); … … 188 204 } 189 205 } 190 191 RefPtr<SharedBuffer> buffer = resourceData(); 192 if (m_loadingMultipartContent && buffer && buffer->size()) { 193 // Since a subresource loader does not load multipart sections progressively, 194 // deliver the previously received data to the loader all at once now. 195 // Then clear the data to make way for the next multipart section. 196 sendDataToResource(buffer->data(), buffer->size()); 197 clearResourceData(); 198 206 } 207 208 void SubresourceLoader::didReceiveData(const char* data, int length, long long encodedDataLength, bool allAtOnce) 209 { 210 ASSERT(!m_resource->resourceToRevalidate()); 211 ASSERT(!m_resource->errorOccurred()); 212 ASSERT(m_state == Initialized); 213 // Reference the object in this method since the additional processing can do 214 // anything including removing the last reference to this object; one example of this is 3266216. 215 RefPtr<SubresourceLoader> protect(this); 216 ResourceLoader::didReceiveData(data, length, encodedDataLength, allAtOnce); 217 218 if (errorLoadingResource()) 219 return; 220 221 sendDataToResource(data, length); 222 223 if (m_loadingMultipartContent) { 224 // Since a subresource loader does not load multipart sections progressively, data was delivered to the loader all at once. 199 225 // After the first multipart section is complete, signal to delegates that this load is "finished" 200 226 m_documentLoader->subresourceLoaderFinishedLoadingOnePart(this); 201 227 didFinishLoadingOnePart(0); 202 228 } 203 }204 205 void SubresourceLoader::didReceiveData(const char* data, int length, long long encodedDataLength, bool allAtOnce)206 {207 ASSERT(!m_resource->resourceToRevalidate());208 ASSERT(!m_resource->errorOccurred());209 // Reference the object in this method since the additional processing can do210 // anything including removing the last reference to this object; one example of this is 3266216.211 RefPtr<SubresourceLoader> protect(this);212 ResourceLoader::didReceiveData(data, length, encodedDataLength, allAtOnce);213 214 if (errorLoadingResource())215 return;216 217 if (!m_loadingMultipartContent)218 sendDataToResource(data, length);219 229 } 220 230 … … 232 242 void SubresourceLoader::sendDataToResource(const char* data, int length) 233 243 { 234 // There are two cases where we might need to create our own SharedBuffer instead of copying the one in ResourceLoader. 235 // (1) Multipart content: The loader delivers the data in a multipart section all at once, then sends eof. 236 // The resource data will change as the next part is loaded, so we need to make a copy. 237 // (2) Our client requested that the data not be buffered at the ResourceLoader level via ResourceLoaderOptions. In this case, 238 // ResourceLoader::resourceData() will be null. However, unlike the multipart case, we don't want to tell the CachedResource 239 // that all data has been received yet. 240 if (m_loadingMultipartContent || !resourceData()) { 241 RefPtr<SharedBuffer> copiedData = SharedBuffer::create(data, length); 242 m_resource->data(copiedData.release(), m_loadingMultipartContent); 243 } else 244 m_resource->data(resourceData(), false); 244 RefPtr<SharedBuffer> buffer = resourceData() ? resourceData() : SharedBuffer::create(data, length); 245 m_resource->data(buffer.release(), m_loadingMultipartContent); 245 246 } 246 247 247 248 void SubresourceLoader::didReceiveCachedMetadata(const char* data, int length) 248 249 { 250 ASSERT(m_state == Initialized); 249 251 ASSERT(!m_resource->resourceToRevalidate()); 250 252 m_resource->setSerializedCachedMetadata(data, length); … … 304 306 ASSERT(!reachedTerminalState()); 305 307 if (m_state != Uninitialized) { 306 if (!m_loadingMultipartContent && m_state != Releasing) 307 m_document->cachedResourceLoader()->decrementRequestCount(m_resource); 308 m_state = Releasing; 308 m_requestCountTracker.clear(); 309 309 m_document->cachedResourceLoader()->loadDone(); 310 310 if (reachedTerminalState()) -
trunk/Source/WebCore/loader/SubresourceLoader.h
r104407 r104756 38 38 39 39 class CachedResource; 40 class CachedResourceLoader; 40 41 class Document; 41 42 class ResourceRequest; … … 79 80 Initialized, 80 81 Revalidating, 81 Finishing, 82 Releasing 82 Finishing 83 }; 84 85 class RequestCountTracker { 86 public: 87 RequestCountTracker(CachedResourceLoader*, CachedResource*); 88 ~RequestCountTracker(); 89 private: 90 CachedResourceLoader* m_cachedResourceLoader; 91 CachedResource* m_resource; 83 92 }; 84 93 … … 87 96 bool m_loadingMultipartContent; 88 97 SubresourceLoaderState m_state; 98 OwnPtr<RequestCountTracker> m_requestCountTracker; 89 99 }; 90 100 -
trunk/Source/WebCore/loader/cache/CachedImage.cpp
r100311 r104756 388 388 } 389 389 390 void CachedImage::setResponse(const ResourceResponse& response) 391 { 392 if (!m_response.isNull()) 393 clear(); 394 CachedResource::setResponse(response); 395 } 396 390 397 void CachedImage::destroyDecodedData() 391 398 { -
trunk/Source/WebCore/loader/cache/CachedImage.h
r99539 r104756 76 76 virtual void data(PassRefPtr<SharedBuffer> data, bool allDataReceived); 77 77 virtual void error(CachedResource::Status); 78 virtual void setResponse(const ResourceResponse&); 78 79 79 80 // For compatibility, images keep loading even if there are HTTP errors. … … 81 82 82 83 virtual bool isImage() const { return true; } 83 84 void clear();85 86 84 bool stillNeedsLoad() const { return !errorOccurred() && status() == Unknown && !isLoading(); } 87 85 void load(); … … 97 95 private: 98 96 Image* lookupOrCreateImageForRenderer(const RenderObject*); 97 98 void clear(); 99 99 100 100 void createImage(); -
trunk/Source/WebCore/loader/cache/CachedResource.cpp
r102300 r104756 215 215 216 216 m_loader = resourceLoadScheduler()->scheduleSubresourceLoad(cachedResourceLoader->document()->frame(), this, m_resourceRequest, m_resourceRequest.priority(), options); 217 if (!m_loader || m_loader->reachedTerminalState()) {217 if (!m_loader) { 218 218 // FIXME: What if resources in other frames were waiting for this revalidation? 219 219 LOG(ResourceLoading, "Cannot start loading '%s'", url().string().latin1().data()); … … 225 225 226 226 m_status = Pending; 227 cachedResourceLoader->incrementRequestCount(this);228 227 } 229 228
Note: See TracChangeset
for help on using the changeset viewer.