| Index: Source/core/fetch/Resource.cpp
|
| diff --git a/Source/core/fetch/Resource.cpp b/Source/core/fetch/Resource.cpp
|
| index ccfae0cb54558d718362deaf03555fdf3d220000..fcbb7ce19a58503553f48890fe1d515554b2bdd0 100644
|
| --- a/Source/core/fetch/Resource.cpp
|
| +++ b/Source/core/fetch/Resource.cpp
|
| @@ -114,7 +114,7 @@ Resource::Resource(const ResourceRequest& request, Type type)
|
| , m_status(Pending)
|
| , m_wasPurged(false)
|
| , m_needsSynchronousCacheHit(false)
|
| -#ifndef NDEBUG
|
| +#ifdef ENABLE_RESOURCE_IS_DELETED_CHECK
|
| , m_deleted(false)
|
| #endif
|
| , m_resourceToRevalidate(0)
|
| @@ -140,11 +140,13 @@ Resource::~Resource()
|
| ASSERT(canDelete());
|
| RELEASE_ASSERT(!memoryCache()->contains(this));
|
| RELEASE_ASSERT(!ResourceCallback::callbackHandler()->isScheduled(this));
|
| - ASSERT(!m_deleted);
|
| ASSERT(url().isNull() || memoryCache()->resourceForURL(KURL(ParsedURLString, url())) != this);
|
| + assertAlive();
|
|
|
| -#ifndef NDEBUG
|
| +#ifdef ENABLE_RESOURCE_IS_DELETED_CHECK
|
| m_deleted = true;
|
| +#endif
|
| +#ifndef NDEBUG
|
| cachedResourceLeakCounter.decrement();
|
| #endif
|
| }
|
| @@ -733,7 +735,7 @@ void Resource::revalidationSucceeded(const ResourceResponse& response)
|
| memoryCache()->replace(m_resourceToRevalidate, this);
|
|
|
| switchClientsToRevalidatedResource();
|
| - ASSERT(!m_deleted);
|
| + assertAlive();
|
| // clearResourceToRevalidate deletes this.
|
| clearResourceToRevalidate();
|
| }
|
| @@ -748,6 +750,7 @@ void Resource::revalidationFailed()
|
|
|
| void Resource::registerHandle(ResourcePtrBase* h)
|
| {
|
| + assertAlive();
|
| ++m_handleCount;
|
| if (m_resourceToRevalidate)
|
| m_handlesToRevalidate.add(h);
|
| @@ -755,6 +758,7 @@ void Resource::registerHandle(ResourcePtrBase* h)
|
|
|
| void Resource::unregisterHandle(ResourcePtrBase* h)
|
| {
|
| + assertAlive();
|
| ASSERT(m_handleCount > 0);
|
| --m_handleCount;
|
|
|
| @@ -847,11 +851,13 @@ void Resource::ResourceCallback::schedule(Resource* resource)
|
| {
|
| if (!m_callbackTimer.isActive())
|
| m_callbackTimer.startOneShot(0, FROM_HERE);
|
| + resource->assertAlive();
|
| m_resourcesWithPendingClients.add(resource);
|
| }
|
|
|
| void Resource::ResourceCallback::cancel(Resource* resource)
|
| {
|
| + resource->assertAlive();
|
| m_resourcesWithPendingClients.remove(resource);
|
| if (m_callbackTimer.isActive() && m_resourcesWithPendingClients.isEmpty())
|
| m_callbackTimer.stop();
|
| @@ -869,8 +875,15 @@ void Resource::ResourceCallback::timerFired(Timer<ResourceCallback>*)
|
| for (HashSet<Resource*>::iterator it = m_resourcesWithPendingClients.begin(); it != end; ++it)
|
| resources.append(*it);
|
| m_resourcesWithPendingClients.clear();
|
| - for (size_t i = 0; i < resources.size(); i++)
|
| +
|
| + for (size_t i = 0; i < resources.size(); i++) {
|
| + resources[i]->assertAlive();
|
| resources[i]->finishPendingClients();
|
| + resources[i]->assertAlive();
|
| + }
|
| +
|
| + for (size_t i = 0; i < resources.size(); i++)
|
| + resources[i]->assertAlive();
|
| }
|
|
|
| static const char* initatorTypeNameToString(const AtomicString& initiatorTypeName)
|
|
|