Diff
Modified: trunk/Source/WebCore/ChangeLog (88390 => 88391)
--- trunk/Source/WebCore/ChangeLog 2011-06-08 21:39:41 UTC (rev 88390)
+++ trunk/Source/WebCore/ChangeLog 2011-06-08 21:45:40 UTC (rev 88391)
@@ -1,3 +1,36 @@
+2011-06-06 Nate Chapin <[email protected]>
+
+ Reviewed by Adam Barth.
+
+ Remove all knowledge of CachedResourceRequests from
+ CachedResourceLoader. This puts the full burden of
+ canceling these requests on DocumentLoader (via
+ SubresourceLoader), and makes a CachedResourceRequest
+ an OwnPtr in CachedResource.
+
+ https://bugs.webkit.org/show_bug.cgi?id=62308
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::stopLoading):
+ * loader/cache/CachedResource.cpp:
+ (WebCore::CachedResource::CachedResource):
+ (WebCore::CachedResource::load):
+ (WebCore::CachedResource::stopLoading):
+ * loader/cache/CachedResource.h:
+ * loader/cache/CachedResourceLoader.cpp:
+ (WebCore::CachedResourceLoader::~CachedResourceLoader):
+ (WebCore::CachedResourceLoader::loadDone):
+ * loader/cache/CachedResourceLoader.h:
+ * loader/cache/CachedResourceRequest.cpp:
+ (WebCore::CachedResourceRequest::CachedResourceRequest):
+ (WebCore::CachedResourceRequest::~CachedResourceRequest):
+ (WebCore::CachedResourceRequest::load):
+ (WebCore::CachedResourceRequest::didFinishLoading):
+ (WebCore::CachedResourceRequest::didFail):
+ (WebCore::CachedResourceRequest::didReceiveResponse):
+ (WebCore::CachedResourceRequest::end):
+ * loader/cache/CachedResourceRequest.h:
+
2011-06-08 Mike Reed <[email protected]>
Reviewed by James Robinson.
Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (88390 => 88391)
--- trunk/Source/WebCore/loader/FrameLoader.cpp 2011-06-08 21:39:41 UTC (rev 88390)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp 2011-06-08 21:45:40 UTC (rev 88391)
@@ -433,9 +433,6 @@
// http://www.w3.org/Bugs/Public/show_bug.cgi?id=10537
doc->setReadyState(Document::Complete);
- if (CachedResourceLoader* cachedResourceLoader = doc->cachedResourceLoader())
- cachedResourceLoader->cancelRequests();
-
#if ENABLE(DATABASE)
doc->stopDatabases(0);
#endif
Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (88390 => 88391)
--- trunk/Source/WebCore/loader/cache/CachedResource.cpp 2011-06-08 21:39:41 UTC (rev 88390)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp 2011-06-08 21:45:40 UTC (rev 88391)
@@ -81,7 +81,6 @@
CachedResource::CachedResource(const ResourceRequest& request, Type type)
: m_resourceRequest(request)
- , m_request(0)
, m_loadPriority(defaultPriorityForResourceType(type))
, m_responseTimestamp(currentTime())
, m_lastDecodedAccessTime(0)
@@ -136,9 +135,11 @@
{
m_sendResourceLoadCallbacks = sendResourceLoadCallbacks;
m_loading = true;
- RefPtr<CachedResourceRequest> request = CachedResourceRequest::load(cachedResourceLoader, this, incremental, securityCheck, sendResourceLoadCallbacks);
- if (request)
- cachedResourceLoader->loadStarted(this, request);
+ m_request = CachedResourceRequest::load(cachedResourceLoader, this, incremental, securityCheck, sendResourceLoadCallbacks);
+ if (m_request) {
+ m_status = Pending;
+ cachedResourceLoader->incrementRequestCount(this);
+ }
}
void CachedResource::checkNotify()
@@ -257,16 +258,15 @@
return m_cachedMetadata.get();
}
-void CachedResource::setRequest(CachedResourceRequest* request)
+void CachedResource::stopLoading()
{
- if (request && !m_request)
- m_status = Pending;
- m_request = request;
+ ASSERT(m_request);
+ m_request.clear();
// All loads finish with data(allDataReceived = true) or error(), except for
// canceled loads, which silently set our request to 0. Be sure to notify our
// client in that case, so we don't seem to continue loading forever.
- if (!m_request && isLoading()) {
+ if (isLoading()) {
setLoading(false);
setStatus(Canceled);
checkNotify();
Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (88390 => 88391)
--- trunk/Source/WebCore/loader/cache/CachedResource.h 2011-06-08 21:39:41 UTC (rev 88390)
+++ trunk/Source/WebCore/loader/cache/CachedResource.h 2011-06-08 21:45:40 UTC (rev 88391)
@@ -163,7 +163,7 @@
void setInLiveDecodedResourcesList(bool b) { m_inLiveDecodedResourcesList = b; }
bool inLiveDecodedResourcesList() { return m_inLiveDecodedResourcesList; }
- void setRequest(CachedResourceRequest*);
+ void stopLoading();
SharedBuffer* data() const { ASSERT(!m_purgeableData); return m_data.get(); }
@@ -238,7 +238,7 @@
ResourceRequest m_resourceRequest;
String m_accept;
- CachedResourceRequest* m_request;
+ OwnPtr<CachedResourceRequest> m_request;
ResourceLoadPriority m_loadPriority;
ResourceResponse m_response;
Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (88390 => 88391)
--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp 2011-06-08 21:39:41 UTC (rev 88390)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp 2011-06-08 21:45:40 UTC (rev 88391)
@@ -86,7 +86,6 @@
CachedResourceLoader::CachedResourceLoader(Document* document)
: m_document(document)
, m_requestCount(0)
- , m_loadDoneActionTimer(this, &CachedResourceLoader::loadDoneActionTimerFired)
, m_autoLoadImages(true)
, m_loadFinishing(false)
, m_allowStaleResources(false)
@@ -97,7 +96,6 @@
{
m_document = 0;
- cancelRequests();
clearPreloads();
DocumentResourceMap::iterator end = m_documentResources.end();
for (DocumentResourceMap::iterator it = m_documentResources.begin(); it != end; ++it)
@@ -554,56 +552,20 @@
m_documentResources.remove(resource->url());
}
-void CachedResourceLoader::loadStarted(CachedResource* resource, PassRefPtr<CachedResourceRequest> request)
+void CachedResourceLoader::loadDone()
{
- ASSERT(request);
- incrementRequestCount(resource);
- m_requests.add(request);
-}
-
-void CachedResourceLoader::loadDone(CachedResourceRequest* request)
-{
m_loadFinishing = false;
- RefPtr<CachedResourceRequest> protect(request);
- if (request)
- m_requests.remove(request);
if (frame())
frame()->loader()->loadDone();
-
- if (!request) {
- // If the request passed to this function is null, loadDone finished synchronously from when
- // the load was started, so we want to kick off our next set of loads (via checkForPendingPreloads
- // and servePendingRequests) asynchronously.
- m_loadDoneActionTimer.startOneShot(0);
- return;
- }
-
performPostLoadActions();
}
-void CachedResourceLoader::loadDoneActionTimerFired(Timer<CachedResourceLoader>*)
-{
- performPostLoadActions();
-}
-
void CachedResourceLoader::performPostLoadActions()
{
checkForPendingPreloads();
resourceLoadScheduler()->servePendingRequests();
}
-void CachedResourceLoader::cancelRequests()
-{
- clearPendingPreloads();
- Vector<CachedResourceRequest*, 256> requestsToCancel;
- RequestSet::iterator end = m_requests.end();
- for (RequestSet::iterator i = m_requests.begin(); i != end; ++i)
- requestsToCancel.append((*i).get());
-
- for (unsigned i = 0; i < requestsToCancel.size(); ++i)
- requestsToCancel[i]->didFail(true);
-}
-
void CachedResourceLoader::notifyLoadedFromMemoryCache(CachedResource* resource)
{
if (!resource || !frame() || resource->status() != CachedResource::Cached)
Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.h (88390 => 88391)
--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.h 2011-06-08 21:39:41 UTC (rev 88390)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.h 2011-06-08 21:45:40 UTC (rev 88391)
@@ -30,7 +30,6 @@
#include "CachedResourceHandle.h"
#include "CachePolicy.h"
#include "ResourceLoadPriority.h"
-#include "Timer.h"
#include <wtf/Deque.h>
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
@@ -42,7 +41,6 @@
class CachedCSSStyleSheet;
class CachedFont;
class CachedImage;
-class CachedResourceRequest;
class CachedScript;
class CachedXSLStyleSheet;
class Document;
@@ -92,10 +90,8 @@
void removeCachedResource(CachedResource*) const;
- void loadStarted(CachedResource*, PassRefPtr<CachedResourceRequest>);
void loadFinishing() { m_loadFinishing = true; }
- void loadDone(CachedResourceRequest*);
- void cancelRequests();
+ void loadDone();
void incrementRequestCount(const CachedResource*);
void decrementRequestCount(const CachedResource*);
@@ -119,16 +115,11 @@
void notifyLoadedFromMemoryCache(CachedResource*);
bool canRequest(CachedResource::Type, const KURL&, bool forPreload = false);
- void loadDoneActionTimerFired(Timer<CachedResourceLoader>*);
-
void performPostLoadActions();
HashSet<String> m_validatedURLs;
mutable DocumentResourceMap m_documentResources;
Document* m_document;
-
- typedef HashSet<RefPtr<CachedResourceRequest> > RequestSet;
- RequestSet m_requests;
int m_requestCount;
@@ -139,8 +130,6 @@
String m_charset;
};
Deque<PendingPreload> m_pendingPreloads;
-
- Timer<CachedResourceLoader> m_loadDoneActionTimer;
//29 bits left
bool m_autoLoadImages : 1;
Modified: trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp (88390 => 88391)
--- trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp 2011-06-08 21:39:41 UTC (rev 88390)
+++ trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp 2011-06-08 21:45:40 UTC (rev 88391)
@@ -79,17 +79,15 @@
, m_multipart(false)
, m_finishing(false)
{
- m_resource->setRequest(this);
}
CachedResourceRequest::~CachedResourceRequest()
{
- m_resource->setRequest(0);
}
-PassRefPtr<CachedResourceRequest> CachedResourceRequest::load(CachedResourceLoader* cachedResourceLoader, CachedResource* resource, bool incremental, SecurityCheckPolicy securityCheck, bool sendResourceLoadCallbacks)
+PassOwnPtr<CachedResourceRequest> CachedResourceRequest::load(CachedResourceLoader* cachedResourceLoader, CachedResource* resource, bool incremental, SecurityCheckPolicy securityCheck, bool sendResourceLoadCallbacks)
{
- RefPtr<CachedResourceRequest> request = adoptRef(new CachedResourceRequest(cachedResourceLoader, resource, incremental));
+ OwnPtr<CachedResourceRequest> request = adoptPtr(new CachedResourceRequest(cachedResourceLoader, resource, incremental));
ResourceRequest resourceRequest = resource->resourceRequest();
resourceRequest.setTargetType(cachedResourceTypeToTargetType(resource->type()));
@@ -130,7 +128,7 @@
if (resource->resourceToRevalidate())
memoryCache()->revalidationFailed(resource);
resource->error(CachedResource::LoadError);
- return 0;
+ return PassOwnPtr<CachedResourceRequest>(nullptr);
}
request->m_loader = loader;
return request.release();
@@ -165,21 +163,15 @@
if (!m_resource->errorOccurred())
m_resource->finish();
}
- m_cachedResourceLoader->loadDone(this);
+ end();
}
-void CachedResourceRequest::didFail(SubresourceLoader*, const ResourceError&)
+void CachedResourceRequest::didFail(SubresourceLoader*, const ResourceError& error)
{
- if (!m_loader)
+ if (m_finishing || !m_loader)
return;
- didFail();
-}
-void CachedResourceRequest::didFail(bool cancelled)
-{
- if (m_finishing)
- return;
-
+ bool cancelled = error.isCancellation();
LOG(ResourceLoading, "Failed to load '%s' (cancelled=%d).\n", m_resource->url().string().latin1().data(), cancelled);
// Prevent the document from being destroyed before we are done with
@@ -201,7 +193,7 @@
if (cancelled || !m_resource->isPreloaded())
memoryCache()->remove(m_resource);
- m_cachedResourceLoader->loadDone(this);
+ end();
}
void CachedResourceRequest::didReceiveResponse(SubresourceLoader* loader, const ResourceResponse& response)
@@ -221,7 +213,7 @@
if (m_cachedResourceLoader->frame())
m_cachedResourceLoader->frame()->loader()->checkCompleted();
- m_cachedResourceLoader->loadDone(this);
+ end();
return;
}
// Did not get 304 response, continue as a regular resource load.
@@ -281,5 +273,11 @@
ASSERT(!m_resource->isCacheValidator());
m_resource->setSerializedCachedMetadata(data, size);
}
+
+void CachedResourceRequest::end()
+{
+ m_cachedResourceLoader->loadDone();
+ m_resource->stopLoading();
+}
} //namespace WebCore
Modified: trunk/Source/WebCore/loader/cache/CachedResourceRequest.h (88390 => 88391)
--- trunk/Source/WebCore/loader/cache/CachedResourceRequest.h 2011-06-08 21:39:41 UTC (rev 88390)
+++ trunk/Source/WebCore/loader/cache/CachedResourceRequest.h 2011-06-08 21:45:40 UTC (rev 88391)
@@ -26,6 +26,7 @@
#include "SubresourceLoaderClient.h"
#include <wtf/HashMap.h>
#include <wtf/Noncopyable.h>
+#include <wtf/PassOwnPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
@@ -38,11 +39,10 @@
class ResourceResponse;
class SubresourceLoader;
- class CachedResourceRequest : public RefCounted<CachedResourceRequest>, private SubresourceLoaderClient {
+ class CachedResourceRequest : private SubresourceLoaderClient {
public:
- static PassRefPtr<CachedResourceRequest> load(CachedResourceLoader*, CachedResource*, bool incremental, SecurityCheckPolicy, bool sendResourceLoadCallbacks);
+ static PassOwnPtr<CachedResourceRequest> load(CachedResourceLoader*, CachedResource*, bool incremental, SecurityCheckPolicy, bool sendResourceLoadCallbacks);
~CachedResourceRequest();
- void didFail(bool cancelled = false);
CachedResourceLoader* cachedResourceLoader() const { return m_cachedResourceLoader; }
@@ -54,6 +54,7 @@
virtual void didReceiveCachedMetadata(SubresourceLoader*, const char*, int);
virtual void didFinishLoading(SubresourceLoader*, double);
virtual void didFail(SubresourceLoader*, const ResourceError&);
+ void end();
RefPtr<SubresourceLoader> m_loader;
CachedResourceLoader* m_cachedResourceLoader;