Index: third_party/WebKit/Source/core/fetch/Resource.cpp |
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp |
index adf843dd7e9831f464f8fd72224979f566c5ea9f..87dc7ac898e9c7190a169aa9424a862151ac3cb2 100644 |
--- a/third_party/WebKit/Source/core/fetch/Resource.cpp |
+++ b/third_party/WebKit/Source/core/fetch/Resource.cpp |
@@ -28,7 +28,7 @@ |
#include "core/fetch/FetchInitiatorTypeNames.h" |
#include "core/fetch/MemoryCache.h" |
#include "core/fetch/ResourceClient.h" |
-#include "core/fetch/ResourceClientOrObserverWalker.h" |
+#include "core/fetch/ResourceClientWalker.h" |
#include "core/fetch/ResourceLoader.h" |
#include "core/inspector/InstanceCounters.h" |
#include "platform/Histogram.h" |
@@ -331,6 +331,9 @@ DEFINE_TRACE(Resource) |
{ |
visitor->trace(m_loader); |
visitor->trace(m_cacheHandler); |
+ visitor->trace(m_clients); |
+ visitor->trace(m_clientsAwaitingCallback); |
+ visitor->trace(m_finishedClients); |
} |
void Resource::setLoader(ResourceLoader* loader) |
@@ -383,7 +386,7 @@ void Resource::setDataBufferingPolicy(DataBufferingPolicy dataBufferingPolicy) |
void Resource::markClientsAndObserversFinished() |
{ |
- HashCountedSet<ResourceClient*> clients; |
+ HeapHashCountedSet<WeakMember<ResourceClient>> clients; |
m_clients.swap(clients); |
for (const auto& it : clients) |
m_finishedClients.add(it.key, it.value); |
@@ -719,7 +722,12 @@ void Resource::addClient(ResourceClient* client) |
void Resource::removeClient(ResourceClient* client) |
{ |
- ASSERT(hasClient(client)); |
+ if (!hasClient(client)) { |
+ // In this case, the client is swept from client lists because they |
+ // hold clients as weak member. |
haraken
2016/08/12 10:45:20
// This code may be called in a pre-finalizer, whe
yhirano
2016/08/16 08:57:24
Done.
|
+ didRemoveClientOrObserver(); |
+ return; |
+ } |
if (m_finishedClients.contains(client)) |
m_finishedClients.remove(client); |
else if (m_clientsAwaitingCallback.contains(client)) |
@@ -731,7 +739,6 @@ void Resource::removeClient(ResourceClient* client) |
ResourceCallback::callbackHandler().cancel(this); |
didRemoveClientOrObserver(); |
- // This object may be dead here. |
} |
void Resource::didRemoveClientOrObserver() |
@@ -809,8 +816,10 @@ void Resource::finishPendingClients() |
// Handle case (1) by saving a list of clients to notify. A separate list also ensure |
// a client is either in m_clients or m_clientsAwaitingCallback. |
- Vector<ResourceClient*> clientsToNotify; |
- copyToVector(m_clientsAwaitingCallback, clientsToNotify); |
+ HeapVector<Member<ResourceClient>> clientsToNotify; |
haraken
2016/08/12 10:45:20
Can we use the asVector?
yhirano
2016/08/16 08:57:24
Using asVector means making clientsToNotify a Heap
haraken
2016/08/16 11:55:44
asVector should convert HeapHashCountedSet<WeakMem
yhirano
2016/08/17 08:36:09
I think HashCountedSet<T, ...>.asVector() should r
|
+ clientsToNotify.reserveCapacity(m_clientsAwaitingCallback.size()); |
+ for (const auto& keyvalue : m_clientsAwaitingCallback) |
+ clientsToNotify.append(keyvalue.key); |
for (const auto& client : clientsToNotify) { |
// Handle case (2) to skip removed clients. |