Changeset 24624 in webkit


Ignore:
Timestamp:
Jul 25, 2007 9:54:22 AM (17 years ago)
Author:
darin
Message:

Reviewed by Maciej, Darin.

Add ResourceHandle::setClient to resolve some messiness with handle
releasing. Clear the client when ResourceLoader is going to release
the handle to prevent crashes in the case where somebody still holds a
reference (this doesn't seem to currently happen in practice). Add
NULL-checking for ResourceHandle implementations using the client.

  • loader/ResourceLoader.cpp: (WebCore::ResourceLoader::releaseResources):
  • platform/network/ResourceHandle.cpp: (WebCore::ResourceHandle::fireBlockedFailure): (WebCore::ResourceHandle::setClient):
  • platform/network/ResourceHandle.h:
  • platform/network/cf/ResourceHandleCFNet.cpp: (WebCore::willSendRequest): (WebCore::didReceiveResponse): (WebCore::didReceiveData): (WebCore::didFinishLoading): (WebCore::didFail): (WebCore::willCacheResponse): (WebCore::ResourceHandle::didReceiveAuthenticationChallenge): (WebCore::ResourceHandle::receivedCancellation):
  • platform/network/mac/ResourceHandleMac.mm: (WebCore::ResourceHandle::didReceiveAuthenticationChallenge): (WebCore::ResourceHandle::didCancelAuthenticationChallenge): (WebCore::ResourceHandle::receivedCancellation): (-[WebCoreResourceHandleAsDelegate connection:willSendRequest:redirectResponse:]): (-[WebCoreResourceHandleAsDelegate connection:didReceiveResponse:]): (-[WebCoreResourceHandleAsDelegate connection:didReceiveData:lengthReceived:]): (-[WebCoreResourceHandleAsDelegate connection:willStopBufferingData:]): (-[WebCoreResourceHandleAsDelegate connectionDidFinishLoading:]): (-[WebCoreResourceHandleAsDelegate connection:didFailWithError:]): (-[WebCoreResourceHandleAsDelegate connection:willCacheResponse:]):
Location:
trunk/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r24623 r24624  
     12007-07-25  Marvin Decker  <marv.decker@gmail.com>
     2
     3        Reviewed by Maciej, Darin.
     4
     5        - http://bugs.webkit.org/show_bug.cgi?id=14030
     6
     7        Add ResourceHandle::setClient to resolve some messiness with handle
     8        releasing. Clear the client when ResourceLoader is going to release
     9        the handle to prevent crashes in the case where somebody still holds a
     10        reference (this doesn't seem to currently happen in practice). Add
     11        NULL-checking for ResourceHandle implementations using the client.
     12
     13        * loader/ResourceLoader.cpp:
     14        (WebCore::ResourceLoader::releaseResources):
     15        * platform/network/ResourceHandle.cpp:
     16        (WebCore::ResourceHandle::fireBlockedFailure):
     17        (WebCore::ResourceHandle::setClient):
     18        * platform/network/ResourceHandle.h:
     19        * platform/network/cf/ResourceHandleCFNet.cpp:
     20        (WebCore::willSendRequest):
     21        (WebCore::didReceiveResponse):
     22        (WebCore::didReceiveData):
     23        (WebCore::didFinishLoading):
     24        (WebCore::didFail):
     25        (WebCore::willCacheResponse):
     26        (WebCore::ResourceHandle::didReceiveAuthenticationChallenge):
     27        (WebCore::ResourceHandle::receivedCancellation):
     28        * platform/network/mac/ResourceHandleMac.mm:
     29        (WebCore::ResourceHandle::didReceiveAuthenticationChallenge):
     30        (WebCore::ResourceHandle::didCancelAuthenticationChallenge):
     31        (WebCore::ResourceHandle::receivedCancellation):
     32        (-[WebCoreResourceHandleAsDelegate connection:willSendRequest:redirectResponse:]):
     33        (-[WebCoreResourceHandleAsDelegate connection:didReceiveResponse:]):
     34        (-[WebCoreResourceHandleAsDelegate connection:didReceiveData:lengthReceived:]):
     35        (-[WebCoreResourceHandleAsDelegate connection:willStopBufferingData:]):
     36        (-[WebCoreResourceHandleAsDelegate connectionDidFinishLoading:]):
     37        (-[WebCoreResourceHandleAsDelegate connection:didFailWithError:]):
     38        (-[WebCoreResourceHandleAsDelegate connection:willCacheResponse:]):
     39
    1402007-07-25  Maxime Britto  <mbritto@pleyo.com>
    241
  • trunk/WebCore/loader/ResourceLoader.cpp

    r24459 r24624  
    9090    m_identifier = 0;
    9191
    92     m_handle = 0;
     92    if (m_handle) {
     93        // Clear out the ResourceHandle's client so that it doesn't try to call
     94        // us back after we release it.
     95        m_handle->setClient(0);
     96        m_handle = 0;
     97    }
     98
    9399    m_resourceData = 0;
    94100    m_deferredRequest = ResourceRequest();
  • trunk/WebCore/platform/network/ResourceHandle.cpp

    r24484 r24624  
    6565void ResourceHandle::fireBlockedFailure(Timer<ResourceHandle>* timer)
    6666{
    67     client()->wasBlocked(this);
     67    if (client())
     68        client()->wasBlocked(this);
    6869    delete timer;
    6970}
     
    7273{
    7374    return d->m_client;
     75}
     76
     77void ResourceHandle::setClient(ResourceHandleClient* client)
     78{
     79    d->m_client = client;
    7480}
    7581
  • trunk/WebCore/platform/network/ResourceHandle.h

    r24202 r24624  
    149149    void clearAuthentication();
    150150    void cancel();
    151    
     151
     152    // The client may be 0, in which case no callbacks will be made.
    152153    ResourceHandleClient* client() const;
     154    void setClient(ResourceHandleClient*);
     155
    153156    void setDefersLoading(bool);
    154157     
  • trunk/WebCore/platform/network/cf/ResourceHandleCFNet.cpp

    r24209 r24624  
    6767
    6868    ResourceRequest request(cfRequest);
    69     handle->client()->willSendRequest(handle, request, cfRedirectResponse);
     69    if (handle->client())
     70        handle->client()->willSendRequest(handle, request, cfRedirectResponse);
    7071
    7172    cfRequest = request.cfURLRequest();
     
    8182    LOG(Network, "CFNet - didReceiveResponse(conn=%p, handle=%p) (%s)", conn, handle, handle->request().url().url().ascii());
    8283
    83     handle->client()->didReceiveResponse(handle, cfResponse);
     84    if (handle->client())
     85        handle->client()->didReceiveResponse(handle, cfResponse);
    8486}
    8587
     
    9294    LOG(Network, "CFNet - didReceiveData(conn=%p, handle=%p, bytes=%d) (%s)", conn, handle, length, handle->request().url().url().ascii());
    9395
    94     handle->client()->didReceiveData(handle, (const char*)bytes, length, originalLength);
     96    if (handle->client())
     97        handle->client()->didReceiveData(handle, (const char*)bytes, length, originalLength);
    9598}
    9699
     
    101104    LOG(Network, "CFNet - didFinishLoading(conn=%p, handle=%p) (%s)", conn, handle, handle->request().url().url().ascii());
    102105
    103     handle->client()->didFinishLoading(handle);
     106    if (handle->client())
     107        handle->client()->didFinishLoading(handle);
    104108}
    105109
     
    110114    LOG(Network, "CFNet - didFail(conn=%p, handle=%p, error = %p) (%s)", conn, handle, error, handle->request().url().url().ascii());
    111115
    112     handle->client()->didFail(handle, ResourceError(error));
     116    if (handle->client())
     117        handle->client()->didFail(handle, ResourceError(error));
    113118}
    114119
     
    119124    CacheStoragePolicy policy = static_cast<CacheStoragePolicy>(CFCachedURLResponseGetStoragePolicy(cachedResponse));
    120125
    121     handle->client()->willCacheResponse(handle, policy);
     126    if (handle->client())
     127        handle->client()->willCacheResponse(handle, policy);
    122128
    123129    if (static_cast<CFURLCacheStoragePolicy>(policy) != CFCachedURLResponseGetStoragePolicy(cachedResponse))
     
    292298    d->m_currentWebChallenge = AuthenticationChallenge(d->m_currentCFChallenge, this);
    293299   
    294     client()->didReceiveAuthenticationChallenge(this, d->m_currentWebChallenge);
     300    if (client())
     301        client()->didReceiveAuthenticationChallenge(this, d->m_currentWebChallenge);
    295302}
    296303
     
    329336        return;
    330337
    331     client()->receivedCancellation(this, challenge);
     338    if (client())
     339        client()->receivedCancellation(this, challenge);
    332340}
    333341
  • trunk/WebCore/platform/network/mac/ResourceHandleMac.mm

    r24205 r24624  
    265265    d->m_currentWebChallenge = core(webChallenge);
    266266    [webChallenge release];
    267    
    268     client()->didReceiveAuthenticationChallenge(this, d->m_currentWebChallenge);
     267
     268    if (client())
     269        client()->didReceiveAuthenticationChallenge(this, d->m_currentWebChallenge);
    269270}
    270271
     
    275276    ASSERT(d->m_currentWebChallenge == challenge);
    276277
    277     client()->didCancelAuthenticationChallenge(this, d->m_currentWebChallenge);
     278    if (client())
     279        client()->didCancelAuthenticationChallenge(this, d->m_currentWebChallenge);
    278280}
    279281
     
    305307        return;
    306308
    307     client()->receivedCancellation(this, challenge);
     309    if (client())
     310        client()->receivedCancellation(this, challenge);
    308311}
    309312
     
    336339- (NSURLRequest *)connection:(NSURLConnection *)con willSendRequest:(NSURLRequest *)newRequest redirectResponse:(NSURLResponse *)redirectResponse
    337340{
    338     if (!m_handle)
     341    if (!m_handle || !m_handle->client())
    339342        return nil;
    340343    ++inNSURLConnectionCallback;
     
    385388- (void)connection:(NSURLConnection *)con didReceiveResponse:(NSURLResponse *)r
    386389{
    387     if (!m_handle)
     390    if (!m_handle || !m_handle->client())
    388391        return;
    389392    ++inNSURLConnectionCallback;
     
    394397- (void)connection:(NSURLConnection *)con didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived
    395398{
    396     if (!m_handle)
     399    if (!m_handle || !m_handle->client())
    397400        return;
    398401    // FIXME: If we get more than 2B bytes in a single chunk, this code won't do the right thing.
     
    406409- (void)connection:(NSURLConnection *)con willStopBufferingData:(NSData *)data
    407410{
    408     if (!m_handle)
     411    if (!m_handle || !m_handle->client())
    409412        return;
    410413    // FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing.
     
    418421- (void)connectionDidFinishLoading:(NSURLConnection *)con
    419422{
    420     if (!m_handle)
     423    if (!m_handle || !m_handle->client())
    421424        return;
    422425    ++inNSURLConnectionCallback;
     
    427430- (void)connection:(NSURLConnection *)con didFailWithError:(NSError *)error
    428431{
    429     if (!m_handle)
     432    if (!m_handle || !m_handle->client())
    430433        return;
    431434    ++inNSURLConnectionCallback;
     
    440443        LOG_ERROR("connection:willCacheResponse: was called inside of [NSURLConnection initWithRequest:delegate:] (4067625)");
    441444#endif
    442     if (!m_handle)
     445    if (!m_handle || !m_handle->client())
    443446        return nil;
    444447    ++inNSURLConnectionCallback;
Note: See TracChangeset for help on using the changeset viewer.