Changeset 145820 in webkit
- Timestamp:
- Mar 14, 2013 9:28:04 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r145819 r145820 1 2013-03-14 Brady Eidson <beidson@apple.com> 2 3 Add a mode to ResourceLoader that takes SharedBuffers instead of raw pointers and lengths. 4 <rdar://problem/13416953> and https://bugs.webkit.org/show_bug.cgi?id=112310 5 6 Reviewed by Andy Estes. 7 8 No new tests (No independently testable change in behavior). 9 10 Many of the tested platforms deliver data buffers to their ResourceHandles from objects 11 that encapsulate a data buffer such as NSData (Mac), CFDataRef (CF), or QByteArray (qt). 12 13 If those platforms also augmented SharedBuffer to wrap their native object (which Mac/CF do) 14 and there existed ResourceLoader callbacks to take that SharedBuffer instead of char* + length, 15 then many resource loads could avoid a useless copy. 16 17 At least on Mac, there are some extremely important behind-the-scenes optimizations for NS/CFData 18 that will be a more important win than simply avoiding a copy. 19 20 This patch adds that SharedBuffer-based callback with the hope that all platforms could find a 21 way to use a buffer-encapsulating object going forward, and we could therefore deprecate the 22 char* + length version of didReceiveData. 23 24 * platform/network/ResourceHandleClient.h: 25 (WebCore::ResourceHandleClient::didReceiveBuffer): Add a didReceiveBuffer callback that takes 26 a SharedBuffer object. The default implementation passes raw bytes + length to didReceiveData. 27 28 * loader/ResourceLoader.cpp: 29 (WebCore::ResourceLoader::addDataOrBuffer): Replacing addData(), optionally adding the data from 30 either a data+length or SharedBuffer 31 (WebCore::ResourceLoader::didReceiveData): Pipe to didReceiveDataOrBuffer. 32 (WebCore::ResourceLoader::didReceiveBuffer): Pipe to didReceiveDataOrBuffer. 33 (WebCore::ResourceLoader::didReceiveDataOrBuffer): Single chokepoint for receiving data. 34 * loader/ResourceLoader.h: Add OVERRIDE to all of the ResourceHandleClient methods to help 35 catch future mistakes. Remove "virtual" from methods that didn't need it. Make "addData" into 36 "addDataOrBuffer" and make it private. 37 38 * loader/NetscapePlugInStreamLoader.cpp: 39 (WebCore::NetscapePlugInStreamLoader::didReceiveData): Pipe to didReceiveDataOrBuffer. 40 (WebCore::NetscapePlugInStreamLoader::didReceiveBuffer): Pipe to didReceiveDataOrBuffer. 41 (WebCore::NetscapePlugInStreamLoader::didReceiveDataOrBuffer): Single chokepoint for receiving data. 42 * loader/NetscapePlugInStreamLoader.h: 43 44 * loader/SubresourceLoader.cpp: 45 (WebCore::SubresourceLoader::didReceiveData): Pipe to didReceiveDataOrBuffer. 46 (WebCore::SubresourceLoader::didReceiveBuffer): Pipe to didReceiveDataOrBuffer. 47 (WebCore::SubresourceLoader::didReceiveDataOrBuffer): Single chokepoint for receiving data. Also, 48 rely on ResourceLoader's base implementation for notifying the ResourceLoadNotifier. 49 * loader/SubresourceLoader.h: 50 51 * loader/ResourceBuffer.cpp: 52 (WebCore::ResourceBuffer::append): Add a mode that appends a SharedBuffer. 53 * loader/ResourceBuffer.h: 54 55 * platform/cf/SharedBufferCF.cpp: 56 (WebCore::SharedBuffer::maybeTransferPlatformData): Fix a bug where appending data to a CFData-backed 57 SharedBuffer would re-enter maybeTransferPlatformData and blow out the stack. 58 59 * platform/network/mac/ResourceHandleMac.mm: 60 (-[WebCoreResourceHandleAsDelegate connection:didReceiveData:lengthReceived:]): Send a wrapped NSData 61 to didReceiveBuffer() instead of sending its char* and length to didReceiveData() 62 1 63 2013-03-14 Yury Semikhatsky <yurys@chromium.org> 2 64 -
trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
r145753 r145820 96 96 void NetscapePlugInStreamLoader::didReceiveData(const char* data, int length, long long encodedDataLength, DataPayloadType dataPayloadType) 97 97 { 98 didReceiveDataOrBuffer(data, length, 0, encodedDataLength, dataPayloadType); 99 } 100 101 void NetscapePlugInStreamLoader::didReceiveBuffer(PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType) 102 { 103 didReceiveDataOrBuffer(0, 0, buffer, encodedDataLength, dataPayloadType); 104 } 105 106 void NetscapePlugInStreamLoader::didReceiveDataOrBuffer(const char* data, int length, PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType) 107 { 98 108 RefPtr<NetscapePlugInStreamLoader> protect(this); 109 110 m_client->didReceiveData(this, buffer ? buffer->data() : data, buffer ? buffer->size() : length); 99 111 100 m_client->didReceiveData(this, data, length); 101 102 ResourceLoader::didReceiveData(data, length, encodedDataLength, dataPayloadType); 112 ResourceLoader::didReceiveDataOrBuffer(data, length, buffer, encodedDataLength, dataPayloadType); 103 113 } 104 114 -
trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h
r145753 r145820 59 59 virtual void didReceiveResponse(const ResourceResponse&) OVERRIDE; 60 60 virtual void didReceiveData(const char*, int, long long encodedDataLength, DataPayloadType) OVERRIDE; 61 virtual void didReceiveBuffer(PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType) OVERRIDE; 61 62 virtual void didFinishLoading(double finishTime) OVERRIDE; 62 63 virtual void didFail(const ResourceError&) OVERRIDE; … … 69 70 virtual void didCancel(const ResourceError&) OVERRIDE; 70 71 72 void didReceiveDataOrBuffer(const char*, int, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType); 73 71 74 NetscapePlugInStreamLoaderClient* m_client; 72 75 }; -
trunk/Source/WebCore/loader/ResourceBuffer.cpp
r141570 r145820 72 72 } 73 73 74 void ResourceBuffer::append(SharedBuffer* buffer) 75 { 76 m_sharedBuffer->append(buffer); 77 } 78 74 79 #if USE(NETWORK_CFDATA_ARRAY_CALLBACK) 75 80 void ResourceBuffer::append(CFDataRef data) -
trunk/Source/WebCore/loader/ResourceBuffer.h
r138319 r145820 56 56 57 57 void append(const char*, unsigned); 58 void append(SharedBuffer*); 58 59 #if USE(NETWORK_CFDATA_ARRAY_CALLBACK) 59 60 void append(CFDataRef); -
trunk/Source/WebCore/loader/ResourceLoader.cpp
r145753 r145820 201 201 202 202 203 void ResourceLoader::addData (const char* data, int length, DataPayloadType dataPayloadType)203 void ResourceLoader::addDataOrBuffer(const char* data, int length, SharedBuffer* buffer, DataPayloadType dataPayloadType) 204 204 { 205 205 if (m_options.dataBufferingPolicy == DoNotBufferData) … … 207 207 208 208 if (dataPayloadType == DataPayloadWholeResource) { 209 m_resourceData = ResourceBuffer::create(data, length);209 m_resourceData = buffer ? ResourceBuffer::adoptSharedBuffer(buffer) : ResourceBuffer::create(data, length); 210 210 return; 211 211 } 212 212 213 213 if (!m_resourceData) 214 m_resourceData = ResourceBuffer::create(data, length); 215 else 216 m_resourceData->append(data, length); 214 m_resourceData = buffer ? ResourceBuffer::adoptSharedBuffer(buffer) : ResourceBuffer::create(data, length); 215 else { 216 if (buffer) 217 m_resourceData->append(buffer); 218 else 219 m_resourceData->append(data, length); 220 } 217 221 } 218 222 … … 296 300 // ASSERT(!m_reachedTerminalState); 297 301 302 didReceiveDataOrBuffer(data, length, 0, encodedDataLength, dataPayloadType); 303 } 304 305 void ResourceLoader::didReceiveBuffer(PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType) 306 { 307 didReceiveDataOrBuffer(0, 0, buffer, encodedDataLength, dataPayloadType); 308 } 309 310 void ResourceLoader::didReceiveDataOrBuffer(const char* data, int length, PassRefPtr<SharedBuffer> prpBuffer, long long encodedDataLength, DataPayloadType dataPayloadType) 311 { 312 // This method should only get data+length *OR* a SharedBuffer. 313 ASSERT(!prpBuffer || (!data && !length)); 314 298 315 // Protect this in this delegate method since the additional processing can do 299 316 // anything including possibly derefing this; one example of this is Radar 3266216. 300 317 RefPtr<ResourceLoader> protector(this); 301 302 addData(data, length, dataPayloadType); 318 RefPtr<SharedBuffer> buffer = prpBuffer; 319 320 addDataOrBuffer(data, length, buffer.get(), dataPayloadType); 321 303 322 // FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing. 304 323 // However, with today's computers and networking speeds, this won't happen in practice. 305 324 // Could be an issue with a giant local file. 306 325 if (m_options.sendLoadCallbacks == SendCallbacks && m_frame) 307 frameLoader()->notifier()->didReceiveData(this, data,length, static_cast<int>(encodedDataLength));326 frameLoader()->notifier()->didReceiveData(this, buffer ? buffer->data() : data, buffer ? buffer->size() : length, static_cast<int>(encodedDataLength)); 308 327 } 309 328 … … 467 486 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceData(m_frame.get(), identifier(), encodedDataLength); 468 487 didReceiveData(data, length, encodedDataLength, DataPayloadBytes); 488 InspectorInstrumentation::didReceiveResourceData(cookie); 489 } 490 491 void ResourceLoader::didReceiveBuffer(ResourceHandle*, PassRefPtr<SharedBuffer> buffer, int encodedDataLength) 492 { 493 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceData(m_frame.get(), identifier(), encodedDataLength); 494 didReceiveBuffer(buffer, encodedDataLength, DataPayloadBytes); 469 495 InspectorInstrumentation::didReceiveResourceData(cookie); 470 496 } -
trunk/Source/WebCore/loader/ResourceLoader.h
r145753 r145820 74 74 const ResourceResponse& response() const; 75 75 76 virtual void addData(const char*, int, DataPayloadType); 77 virtual PassRefPtr<ResourceBuffer> resourceData(); 76 PassRefPtr<ResourceBuffer> resourceData(); 78 77 void clearResourceData(); 78 79 79 virtual bool isSubresourceLoader(); 80 80 … … 83 83 virtual void didReceiveResponse(const ResourceResponse&); 84 84 virtual void didReceiveData(const char*, int, long long encodedDataLength, DataPayloadType); 85 virtual void didReceiveBuffer(PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType); 85 86 virtual void didReceiveCachedMetadata(const char*, int) { } 86 87 void willStopBufferingData(const char*, int); … … 101 102 102 103 // ResourceHandleClient 103 virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse& redirectResponse); 104 virtual void didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); 105 virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&); 106 virtual void didReceiveData(ResourceHandle*, const char*, int, int encodedDataLength); 107 virtual void didReceiveCachedMetadata(ResourceHandle*, const char* data, int length) { didReceiveCachedMetadata(data, length); } 108 virtual void didFinishLoading(ResourceHandle*, double finishTime); 109 virtual void didFail(ResourceHandle*, const ResourceError&); 110 virtual void wasBlocked(ResourceHandle*); 111 virtual void cannotShowURL(ResourceHandle*); 104 virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse& redirectResponse) OVERRIDE; 105 virtual void didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) OVERRIDE; 106 virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&) OVERRIDE; 107 virtual void didReceiveData(ResourceHandle*, const char*, int, int encodedDataLength) OVERRIDE; 108 virtual void didReceiveBuffer(ResourceHandle*, PassRefPtr<SharedBuffer>, int encodedDataLength) OVERRIDE; 109 virtual void didReceiveCachedMetadata(ResourceHandle*, const char* data, int length) OVERRIDE { didReceiveCachedMetadata(data, length); } 110 virtual void didFinishLoading(ResourceHandle*, double finishTime) OVERRIDE; 111 virtual void didFail(ResourceHandle*, const ResourceError&) OVERRIDE; 112 virtual void wasBlocked(ResourceHandle*) OVERRIDE; 113 virtual void cannotShowURL(ResourceHandle*) OVERRIDE; 112 114 virtual void willStopBufferingData(ResourceHandle*, const char* data, int length) { willStopBufferingData(data, length); } 113 virtual bool shouldUseCredentialStorage(ResourceHandle*) { return shouldUseCredentialStorage(); }114 virtual void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) { didReceiveAuthenticationChallenge(challenge); }115 virtual void didCancelAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) { didCancelAuthenticationChallenge(challenge); }115 virtual bool shouldUseCredentialStorage(ResourceHandle*) OVERRIDE { return shouldUseCredentialStorage(); } 116 virtual void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) OVERRIDE { didReceiveAuthenticationChallenge(challenge); } 117 virtual void didCancelAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) OVERRIDE { didCancelAuthenticationChallenge(challenge); } 116 118 #if USE(NETWORK_CFDATA_ARRAY_CALLBACK) 117 virtual void didReceiveDataArray(ResourceHandle*, CFArrayRef dataArray) ;119 virtual void didReceiveDataArray(ResourceHandle*, CFArrayRef dataArray) OVERRIDE; 118 120 #endif 119 121 #if USE(PROTECTION_SPACE_AUTH_CALLBACK) 120 virtual bool canAuthenticateAgainstProtectionSpace(ResourceHandle*, const ProtectionSpace& protectionSpace) { return canAuthenticateAgainstProtectionSpace(protectionSpace); }121 #endif 122 virtual void receivedCancellation(ResourceHandle*, const AuthenticationChallenge& challenge) { receivedCancellation(challenge); }122 virtual bool canAuthenticateAgainstProtectionSpace(ResourceHandle*, const ProtectionSpace& protectionSpace) OVERRIDE { return canAuthenticateAgainstProtectionSpace(protectionSpace); } 123 #endif 124 virtual void receivedCancellation(ResourceHandle*, const AuthenticationChallenge& challenge) OVERRIDE { receivedCancellation(challenge); } 123 125 #if PLATFORM(MAC) 124 126 #if USE(CFNETWORK) 125 virtual CFCachedURLResponseRef willCacheResponse(ResourceHandle*, CFCachedURLResponseRef) ;127 virtual CFCachedURLResponseRef willCacheResponse(ResourceHandle*, CFCachedURLResponseRef) OVERRIDE; 126 128 #else 127 virtual NSCachedURLResponse* willCacheResponse(ResourceHandle*, NSCachedURLResponse*) ;129 virtual NSCachedURLResponse* willCacheResponse(ResourceHandle*, NSCachedURLResponse*) OVERRIDE; 128 130 #endif 129 131 #endif // PLATFORM(MAC) 130 132 #if PLATFORM(WIN) && USE(CFNETWORK) 131 133 // FIXME: Windows should use willCacheResponse - <https://bugs.webkit.org/show_bug.cgi?id=57257>. 132 virtual bool shouldCacheResponse(ResourceHandle*, CFCachedURLResponseRef) ;134 virtual bool shouldCacheResponse(ResourceHandle*, CFCachedURLResponseRef) OVERRIDE; 133 135 #endif 134 136 #if PLATFORM(CHROMIUM) … … 163 165 bool cancelled() const { return m_cancelled; } 164 166 167 void didReceiveDataOrBuffer(const char*, int, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType); 168 165 169 RefPtr<ResourceHandle> m_handle; 166 170 RefPtr<Frame> m_frame; … … 172 176 virtual void didCancel(const ResourceError&) = 0; 173 177 178 void addDataOrBuffer(const char*, int, SharedBuffer*, DataPayloadType); 179 174 180 ResourceRequest m_request; 175 181 ResourceRequest m_originalRequest; // Before redirects. -
trunk/Source/WebCore/loader/SubresourceLoader.cpp
r145753 r145820 216 216 void SubresourceLoader::didReceiveData(const char* data, int length, long long encodedDataLength, DataPayloadType dataPayloadType) 217 217 { 218 didReceiveDataOrBuffer(data, length, 0, encodedDataLength, dataPayloadType); 219 } 220 221 void SubresourceLoader::didReceiveBuffer(PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType) 222 { 223 didReceiveDataOrBuffer(0, 0, buffer, encodedDataLength, dataPayloadType); 224 } 225 226 void SubresourceLoader::didReceiveDataOrBuffer(const char* data, int length, PassRefPtr<SharedBuffer> prpBuffer, long long encodedDataLength, DataPayloadType dataPayloadType) 227 { 218 228 if (m_resource->response().httpStatusCode() >= 400 && !m_resource->shouldIgnoreHTTPStatusCodeErrors()) 219 229 return; … … 224 234 // anything including removing the last reference to this object; one example of this is 3266216. 225 235 RefPtr<SubresourceLoader> protect(this); 226 addData(data, length, dataPayloadType); 236 RefPtr<SharedBuffer> buffer = prpBuffer; 237 238 ResourceLoader::didReceiveDataOrBuffer(data, length, buffer, encodedDataLength, dataPayloadType); 239 227 240 if (!m_loadingMultipartContent) 228 sendDataToResource(data, length); 229 if (shouldSendResourceLoadCallbacks() && m_frame) 230 frameLoader()->notifier()->didReceiveData(this, data, length, static_cast<int>(encodedDataLength)); 241 sendDataToResource(buffer ? buffer->data() : data, buffer ? buffer->size() : length); 231 242 } 232 243 -
trunk/Source/WebCore/loader/SubresourceLoader.h
r145753 r145820 62 62 virtual void didReceiveResponse(const ResourceResponse&) OVERRIDE; 63 63 virtual void didReceiveData(const char*, int, long long encodedDataLength, DataPayloadType) OVERRIDE; 64 virtual void didReceiveBuffer(PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType) OVERRIDE; 64 65 virtual void didReceiveCachedMetadata(const char*, int) OVERRIDE; 65 66 virtual void didFinishLoading(double finishTime) OVERRIDE; … … 79 80 bool checkForHTTPStatusCodeError(); 80 81 void sendDataToResource(const char*, int); 82 83 void didReceiveDataOrBuffer(const char*, int, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType); 81 84 82 85 enum SubresourceLoaderState { -
trunk/Source/WebCore/platform/cf/SharedBufferCF.cpp
r135221 r145820 81 81 82 82 ASSERT(!m_size); 83 84 append(reinterpret_cast<const char*>(CFDataGetBytePtr(m_cfData.get())), CFDataGetLength(m_cfData.get())); 85 86 m_cfData = 0; 83 84 // Hang on to the m_cfData pointer in a local pointer as append() will re-enter maybeTransferPlatformData() 85 // and we need to make sure to early return when it does. 86 RetainPtr<CFDataRef> cfData = m_cfData.leakRef(); 87 88 append(reinterpret_cast<const char*>(CFDataGetBytePtr(cfData.get())), CFDataGetLength(cfData.get())); 87 89 } 88 90 -
trunk/Source/WebCore/platform/network/ResourceHandleClient.h
r144770 r145820 27 27 #define ResourceHandleClient_h 28 28 29 #include "SharedBuffer.h" 29 30 #include <wtf/CurrentTime.h> 30 31 #include <wtf/RefCounted.h> … … 87 88 88 89 virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&) { } 90 89 91 virtual void didReceiveData(ResourceHandle*, const char*, int, int /*encodedDataLength*/) { } 92 virtual void didReceiveBuffer(ResourceHandle* handle, PassRefPtr<SharedBuffer> buffer, int encodedDataLength) 93 { 94 didReceiveData(handle, buffer->data(), buffer->size(), encodedDataLength); 95 } 96 90 97 virtual void didReceiveCachedMetadata(ResourceHandle*, const char*, int) { } 91 98 virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/) { } -
trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm
r145592 r145820 757 757 // -1 means we do not provide any data about transfer size to inspector so it would use 758 758 // Content-Length headers or content size to show transfer size. 759 m_handle->client()->didReceive Data(m_handle, (const char*)[data bytes], [data length], -1);759 m_handle->client()->didReceiveBuffer(m_handle, SharedBuffer::wrapNSData(data), -1); 760 760 } 761 761
Note: See TracChangeset
for help on using the changeset viewer.