Changeset 104756 in webkit


Ignore:
Timestamp:
Jan 11, 2012 3:54:28 PM (12 years ago)
Author:
Nate Chapin
Message:

SubresourceLoader cleanup post r100311.

  1. Simplify matching incrementRequestCount()/decrementRequestCount() calls.
  2. Remove CachedImage custom code from SubresourceLoader.
  3. Add a bunch of ASSERTs.
  4. Remove the multipart-only call to didReceiveData() from didReceiveResponse(), since didReceiveData() would get called immediately after anyway.

https://bugs.webkit.org/show_bug.cgi?id=75887

Reviewed by Adam Barth.

No new tests, refactor only.

  • loader/SubresourceLoader.cpp:

(WebCore::SubresourceLoader::didReceiveResponse): Remove multipart special case, handle it in didReceiveData().
(WebCore::SubresourceLoader::didReceiveData): Handle multipart state here, since we will receive only one

didReceiveData() call per multipart segment, but no didFinishLoading() call.

  • loader/SubresourceLoader.h: Add a RequestCountTracker subclass to reduce complexity of ensuring we don't

decrement request count twice on CachedResourceLoader.

  • loader/cache/CachedImage.cpp:

(WebCore::CachedImage::setResponse): Move CachedImage::clear() call out of SubresourceLoader, since it's

kind of a layering violation as is.

  • loader/cache/CachedImage.h:
  • loader/cache/CachedResource.cpp:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r104755 r104756  
     12012-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
    1272012-01-11  Joshua Bell  <jsbell@chromium.org>
    228
  • trunk/Source/WebCore/loader/SubresourceLoader.cpp

    r104407 r104756  
    3030#include "SubresourceLoader.h"
    3131
    32 #include "CachedImage.h"
    3332#include "CachedResourceLoader.h"
    3433#include "Document.h"
     
    4847DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, subresourceLoaderCounter, ("SubresourceLoader"));
    4948
     49SubresourceLoader::RequestCountTracker::RequestCountTracker(CachedResourceLoader* cachedResourceLoader, CachedResource* resource)
     50    : m_cachedResourceLoader(cachedResourceLoader)
     51    , m_resource(resource)
     52{
     53    m_cachedResourceLoader->incrementRequestCount(m_resource);
     54}
     55
     56SubresourceLoader::RequestCountTracker::~RequestCountTracker()
     57{
     58    m_cachedResourceLoader->decrementRequestCount(m_resource);
     59}
     60
    5061SubresourceLoader::SubresourceLoader(Frame* frame, CachedResource* resource, const ResourceLoaderOptions& options)
    5162    : ResourceLoader(frame, options)
     
    5465    , m_loadingMultipartContent(false)
    5566    , m_state(Uninitialized)
     67    , m_requestCountTracker(adoptPtr(new RequestCountTracker(frame->document()->cachedResourceLoader(), resource)))
    5668{
    5769#ifndef NDEBUG
     
    6274SubresourceLoader::~SubresourceLoader()
    6375{
     76    ASSERT(m_state != Initialized);
     77    ASSERT(!m_document);
     78    ASSERT(reachedTerminalState());
    6479#ifndef NDEBUG
    6580    subresourceLoaderCounter.decrement();
     
    120135        return false;
    121136
     137    ASSERT(!reachedTerminalState());
    122138    m_state = Initialized;
    123139    m_documentLoader->addSubresourceLoader(this);
     
    142158void SubresourceLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
    143159{
     160    ASSERT(m_state == Initialized);
    144161    RefPtr<SubresourceLoader> protect(this);
    145162    m_resource->didSendData(bytesSent, totalBytesToBeSent);
     
    149166{
    150167    ASSERT(!response.isNull());
     168    ASSERT(m_state == Initialized);
    151169
    152170    // Reference the object in this method since the additional processing can do
     
    175193    ResourceLoader::didReceiveResponse(response);
    176194
    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()) {
    181196        m_loadingMultipartContent = true;
    182197
    183198        // 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);
    185201        if (!m_resource->isImage()) {
    186202            cancel();
     
    188204        }
    189205    }
    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
     208void 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.       
    199225        // After the first multipart section is complete, signal to delegates that this load is "finished"
    200226        m_documentLoader->subresourceLoaderFinishedLoadingOnePart(this);
    201227        didFinishLoadingOnePart(0);
    202228    }
    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 do
    210     // 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);
    219229}
    220230
     
    232242void SubresourceLoader::sendDataToResource(const char* data, int length)
    233243{
    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);
    245246}
    246247
    247248void SubresourceLoader::didReceiveCachedMetadata(const char* data, int length)
    248249{
     250    ASSERT(m_state == Initialized);
    249251    ASSERT(!m_resource->resourceToRevalidate());
    250252    m_resource->setSerializedCachedMetadata(data, length);
     
    304306    ASSERT(!reachedTerminalState());
    305307    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();
    309309        m_document->cachedResourceLoader()->loadDone();
    310310        if (reachedTerminalState())
  • trunk/Source/WebCore/loader/SubresourceLoader.h

    r104407 r104756  
    3838
    3939class CachedResource;
     40class CachedResourceLoader;
    4041class Document;
    4142class ResourceRequest;
     
    7980        Initialized,
    8081        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;
    8392    };
    8493
     
    8796    bool m_loadingMultipartContent;
    8897    SubresourceLoaderState m_state;
     98    OwnPtr<RequestCountTracker> m_requestCountTracker;
    8999};
    90100
  • trunk/Source/WebCore/loader/cache/CachedImage.cpp

    r100311 r104756  
    388388}
    389389
     390void CachedImage::setResponse(const ResourceResponse& response)
     391{
     392    if (!m_response.isNull())
     393        clear();
     394    CachedResource::setResponse(response);
     395}
     396
    390397void CachedImage::destroyDecodedData()
    391398{
  • trunk/Source/WebCore/loader/cache/CachedImage.h

    r99539 r104756  
    7676    virtual void data(PassRefPtr<SharedBuffer> data, bool allDataReceived);
    7777    virtual void error(CachedResource::Status);
     78    virtual void setResponse(const ResourceResponse&);
    7879   
    7980    // For compatibility, images keep loading even if there are HTTP errors.
     
    8182
    8283    virtual bool isImage() const { return true; }
    83 
    84     void clear();
    85    
    8684    bool stillNeedsLoad() const { return !errorOccurred() && status() == Unknown && !isLoading(); }
    8785    void load();
     
    9795private:
    9896    Image* lookupOrCreateImageForRenderer(const RenderObject*);
     97
     98    void clear();
    9999
    100100    void createImage();
  • trunk/Source/WebCore/loader/cache/CachedResource.cpp

    r102300 r104756  
    215215   
    216216    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) {
    218218        // FIXME: What if resources in other frames were waiting for this revalidation?
    219219        LOG(ResourceLoading, "Cannot start loading '%s'", url().string().latin1().data());
     
    225225
    226226    m_status = Pending;
    227     cachedResourceLoader->incrementRequestCount(this);
    228227}
    229228
Note: See TracChangeset for help on using the changeset viewer.