Changeset 145820 in webkit


Ignore:
Timestamp:
Mar 14, 2013 9:28:04 AM (11 years ago)
Author:
beidson@apple.com
Message:

Add a mode to ResourceLoader that takes SharedBuffers instead of raw pointers and lengths.
<rdar://problem/13416953> and https://bugs.webkit.org/show_bug.cgi?id=112310

Reviewed by Andy Estes.

No new tests (No independently testable change in behavior).

Many of the tested platforms deliver data buffers to their ResourceHandles from objects
that encapsulate a data buffer such as NSData (Mac), CFDataRef (CF), or QByteArray (qt).

If those platforms also augmented SharedBuffer to wrap their native object (which Mac/CF do)
and there existed ResourceLoader callbacks to take that SharedBuffer instead of char* + length,
then many resource loads could avoid a useless copy.

At least on Mac, there are some extremely important behind-the-scenes optimizations for NS/CFData
that will be a more important win than simply avoiding a copy.

This patch adds that SharedBuffer-based callback with the hope that all platforms could find a
way to use a buffer-encapsulating object going forward, and we could therefore deprecate the
char* + length version of didReceiveData.

  • platform/network/ResourceHandleClient.h:

(WebCore::ResourceHandleClient::didReceiveBuffer): Add a didReceiveBuffer callback that takes

a SharedBuffer object. The default implementation passes raw bytes + length to didReceiveData.

  • loader/ResourceLoader.cpp:

(WebCore::ResourceLoader::addDataOrBuffer): Replacing addData(), optionally adding the data from

either a data+length or SharedBuffer

(WebCore::ResourceLoader::didReceiveData): Pipe to didReceiveDataOrBuffer.
(WebCore::ResourceLoader::didReceiveBuffer): Pipe to didReceiveDataOrBuffer.
(WebCore::ResourceLoader::didReceiveDataOrBuffer): Single chokepoint for receiving data.

  • loader/ResourceLoader.h: Add OVERRIDE to all of the ResourceHandleClient methods to help catch future mistakes. Remove "virtual" from methods that didn't need it. Make "addData" into "addDataOrBuffer" and make it private.
  • loader/NetscapePlugInStreamLoader.cpp:

(WebCore::NetscapePlugInStreamLoader::didReceiveData): Pipe to didReceiveDataOrBuffer.
(WebCore::NetscapePlugInStreamLoader::didReceiveBuffer): Pipe to didReceiveDataOrBuffer.
(WebCore::NetscapePlugInStreamLoader::didReceiveDataOrBuffer): Single chokepoint for receiving data.

  • loader/NetscapePlugInStreamLoader.h:
  • loader/SubresourceLoader.cpp:

(WebCore::SubresourceLoader::didReceiveData): Pipe to didReceiveDataOrBuffer.
(WebCore::SubresourceLoader::didReceiveBuffer): Pipe to didReceiveDataOrBuffer.
(WebCore::SubresourceLoader::didReceiveDataOrBuffer): Single chokepoint for receiving data. Also,

rely on ResourceLoader's base implementation for notifying the ResourceLoadNotifier.

  • loader/SubresourceLoader.h:
  • loader/ResourceBuffer.cpp:

(WebCore::ResourceBuffer::append): Add a mode that appends a SharedBuffer.

  • loader/ResourceBuffer.h:
  • platform/cf/SharedBufferCF.cpp:

(WebCore::SharedBuffer::maybeTransferPlatformData): Fix a bug where appending data to a CFData-backed

SharedBuffer would re-enter maybeTransferPlatformData and blow out the stack.

  • platform/network/mac/ResourceHandleMac.mm:

(-[WebCoreResourceHandleAsDelegate connection:didReceiveData:lengthReceived:]): Send a wrapped NSData

to didReceiveBuffer() instead of sending its char* and length to didReceiveData()

Location:
trunk/Source/WebCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r145819 r145820  
     12013-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
    1632013-03-14  Yury Semikhatsky  <yurys@chromium.org>
    264
  • trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp

    r145753 r145820  
    9696void NetscapePlugInStreamLoader::didReceiveData(const char* data, int length, long long encodedDataLength, DataPayloadType dataPayloadType)
    9797{
     98    didReceiveDataOrBuffer(data, length, 0, encodedDataLength, dataPayloadType);
     99}
     100
     101void NetscapePlugInStreamLoader::didReceiveBuffer(PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType)
     102{
     103    didReceiveDataOrBuffer(0, 0, buffer, encodedDataLength, dataPayloadType);
     104}
     105
     106void NetscapePlugInStreamLoader::didReceiveDataOrBuffer(const char* data, int length, PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType)
     107{
    98108    RefPtr<NetscapePlugInStreamLoader> protect(this);
     109   
     110    m_client->didReceiveData(this, buffer ? buffer->data() : data, buffer ? buffer->size() : length);
    99111
    100     m_client->didReceiveData(this, data, length);
    101    
    102     ResourceLoader::didReceiveData(data, length, encodedDataLength, dataPayloadType);
     112    ResourceLoader::didReceiveDataOrBuffer(data, length, buffer, encodedDataLength, dataPayloadType);
    103113}
    104114
  • trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h

    r145753 r145820  
    5959    virtual void didReceiveResponse(const ResourceResponse&) OVERRIDE;
    6060    virtual void didReceiveData(const char*, int, long long encodedDataLength, DataPayloadType) OVERRIDE;
     61    virtual void didReceiveBuffer(PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType) OVERRIDE;
    6162    virtual void didFinishLoading(double finishTime) OVERRIDE;
    6263    virtual void didFail(const ResourceError&) OVERRIDE;
     
    6970    virtual void didCancel(const ResourceError&) OVERRIDE;
    7071
     72    void didReceiveDataOrBuffer(const char*, int, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType);
     73
    7174    NetscapePlugInStreamLoaderClient* m_client;
    7275};
  • trunk/Source/WebCore/loader/ResourceBuffer.cpp

    r141570 r145820  
    7272}
    7373
     74void ResourceBuffer::append(SharedBuffer* buffer)
     75{
     76    m_sharedBuffer->append(buffer);
     77}
     78
    7479#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
    7580void ResourceBuffer::append(CFDataRef data)
  • trunk/Source/WebCore/loader/ResourceBuffer.h

    r138319 r145820  
    5656
    5757    void append(const char*, unsigned);
     58    void append(SharedBuffer*);
    5859#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
    5960    void append(CFDataRef);
  • trunk/Source/WebCore/loader/ResourceLoader.cpp

    r145753 r145820  
    201201   
    202202
    203 void ResourceLoader::addData(const char* data, int length, DataPayloadType dataPayloadType)
     203void ResourceLoader::addDataOrBuffer(const char* data, int length, SharedBuffer* buffer, DataPayloadType dataPayloadType)
    204204{
    205205    if (m_options.dataBufferingPolicy == DoNotBufferData)
     
    207207
    208208    if (dataPayloadType == DataPayloadWholeResource) {
    209         m_resourceData = ResourceBuffer::create(data, length);
     209        m_resourceData = buffer ? ResourceBuffer::adoptSharedBuffer(buffer) : ResourceBuffer::create(data, length);
    210210        return;
    211211    }
    212212       
    213213    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    }
    217221}
    218222
     
    296300    // ASSERT(!m_reachedTerminalState);
    297301
     302    didReceiveDataOrBuffer(data, length, 0, encodedDataLength, dataPayloadType);
     303}
     304
     305void ResourceLoader::didReceiveBuffer(PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType)
     306{
     307    didReceiveDataOrBuffer(0, 0, buffer, encodedDataLength, dataPayloadType);
     308}
     309
     310void 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
    298315    // Protect this in this delegate method since the additional processing can do
    299316    // anything including possibly derefing this; one example of this is Radar 3266216.
    300317    RefPtr<ResourceLoader> protector(this);
    301 
    302     addData(data, length, dataPayloadType);
     318    RefPtr<SharedBuffer> buffer = prpBuffer;
     319
     320    addDataOrBuffer(data, length, buffer.get(), dataPayloadType);
     321   
    303322    // FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing.
    304323    // However, with today's computers and networking speeds, this won't happen in practice.
    305324    // Could be an issue with a giant local file.
    306325    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));
    308327}
    309328
     
    467486    InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceData(m_frame.get(), identifier(), encodedDataLength);
    468487    didReceiveData(data, length, encodedDataLength, DataPayloadBytes);
     488    InspectorInstrumentation::didReceiveResourceData(cookie);
     489}
     490
     491void ResourceLoader::didReceiveBuffer(ResourceHandle*, PassRefPtr<SharedBuffer> buffer, int encodedDataLength)
     492{
     493    InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceData(m_frame.get(), identifier(), encodedDataLength);
     494    didReceiveBuffer(buffer, encodedDataLength, DataPayloadBytes);
    469495    InspectorInstrumentation::didReceiveResourceData(cookie);
    470496}
  • trunk/Source/WebCore/loader/ResourceLoader.h

    r145753 r145820  
    7474    const ResourceResponse& response() const;
    7575
    76     virtual void addData(const char*, int, DataPayloadType);
    77     virtual PassRefPtr<ResourceBuffer> resourceData();
     76    PassRefPtr<ResourceBuffer> resourceData();
    7877    void clearResourceData();
     78   
    7979    virtual bool isSubresourceLoader();
    8080   
     
    8383    virtual void didReceiveResponse(const ResourceResponse&);
    8484    virtual void didReceiveData(const char*, int, long long encodedDataLength, DataPayloadType);
     85    virtual void didReceiveBuffer(PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType);
    8586    virtual void didReceiveCachedMetadata(const char*, int) { }
    8687    void willStopBufferingData(const char*, int);
     
    101102
    102103    // 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;
    112114    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); }
    116118#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
    117     virtual void didReceiveDataArray(ResourceHandle*, CFArrayRef dataArray);
     119    virtual void didReceiveDataArray(ResourceHandle*, CFArrayRef dataArray) OVERRIDE;
    118120#endif
    119121#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); }
    123125#if PLATFORM(MAC)
    124126#if USE(CFNETWORK)
    125     virtual CFCachedURLResponseRef willCacheResponse(ResourceHandle*, CFCachedURLResponseRef);
     127    virtual CFCachedURLResponseRef willCacheResponse(ResourceHandle*, CFCachedURLResponseRef) OVERRIDE;
    126128#else
    127     virtual NSCachedURLResponse* willCacheResponse(ResourceHandle*, NSCachedURLResponse*);
     129    virtual NSCachedURLResponse* willCacheResponse(ResourceHandle*, NSCachedURLResponse*) OVERRIDE;
    128130#endif
    129131#endif // PLATFORM(MAC)
    130132#if PLATFORM(WIN) && USE(CFNETWORK)
    131133    // 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;
    133135#endif
    134136#if PLATFORM(CHROMIUM)
     
    163165    bool cancelled() const { return m_cancelled; }
    164166
     167    void didReceiveDataOrBuffer(const char*, int, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType);
     168
    165169    RefPtr<ResourceHandle> m_handle;
    166170    RefPtr<Frame> m_frame;
     
    172176    virtual void didCancel(const ResourceError&) = 0;
    173177
     178    void addDataOrBuffer(const char*, int, SharedBuffer*, DataPayloadType);
     179
    174180    ResourceRequest m_request;
    175181    ResourceRequest m_originalRequest; // Before redirects.
  • trunk/Source/WebCore/loader/SubresourceLoader.cpp

    r145753 r145820  
    216216void SubresourceLoader::didReceiveData(const char* data, int length, long long encodedDataLength, DataPayloadType dataPayloadType)
    217217{
     218    didReceiveDataOrBuffer(data, length, 0, encodedDataLength, dataPayloadType);
     219}
     220
     221void SubresourceLoader::didReceiveBuffer(PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType)
     222{
     223    didReceiveDataOrBuffer(0, 0, buffer, encodedDataLength, dataPayloadType);
     224}
     225
     226void SubresourceLoader::didReceiveDataOrBuffer(const char* data, int length, PassRefPtr<SharedBuffer> prpBuffer, long long encodedDataLength, DataPayloadType dataPayloadType)
     227{
    218228    if (m_resource->response().httpStatusCode() >= 400 && !m_resource->shouldIgnoreHTTPStatusCodeErrors())
    219229        return;
     
    224234    // anything including removing the last reference to this object; one example of this is 3266216.
    225235    RefPtr<SubresourceLoader> protect(this);
    226     addData(data, length, dataPayloadType);
     236    RefPtr<SharedBuffer> buffer = prpBuffer;
     237   
     238    ResourceLoader::didReceiveDataOrBuffer(data, length, buffer, encodedDataLength, dataPayloadType);
     239
    227240    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);
    231242}
    232243
  • trunk/Source/WebCore/loader/SubresourceLoader.h

    r145753 r145820  
    6262    virtual void didReceiveResponse(const ResourceResponse&) OVERRIDE;
    6363    virtual void didReceiveData(const char*, int, long long encodedDataLength, DataPayloadType) OVERRIDE;
     64    virtual void didReceiveBuffer(PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType) OVERRIDE;
    6465    virtual void didReceiveCachedMetadata(const char*, int) OVERRIDE;
    6566    virtual void didFinishLoading(double finishTime) OVERRIDE;
     
    7980    bool checkForHTTPStatusCodeError();
    8081    void sendDataToResource(const char*, int);
     82
     83    void didReceiveDataOrBuffer(const char*, int, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType);
    8184
    8285    enum SubresourceLoaderState {
  • trunk/Source/WebCore/platform/cf/SharedBufferCF.cpp

    r135221 r145820  
    8181   
    8282    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()));
    8789}
    8890
  • trunk/Source/WebCore/platform/network/ResourceHandleClient.h

    r144770 r145820  
    2727#define ResourceHandleClient_h
    2828
     29#include "SharedBuffer.h"
    2930#include <wtf/CurrentTime.h>
    3031#include <wtf/RefCounted.h>
     
    8788
    8889        virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&) { }
     90       
    8991        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       
    9097        virtual void didReceiveCachedMetadata(ResourceHandle*, const char*, int) { }
    9198        virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/) { }
  • trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm

    r145592 r145820  
    757757    // -1 means we do not provide any data about transfer size to inspector so it would use
    758758    // Content-Length headers or content size to show transfer size.
    759     m_handle->client()->didReceiveData(m_handle, (const char*)[data bytes], [data length], -1);
     759    m_handle->client()->didReceiveBuffer(m_handle, SharedBuffer::wrapNSData(data), -1);
    760760}
    761761
Note: See TracChangeset for help on using the changeset viewer.