Index: third_party/WebKit/Source/core/fetch/ResourceClientWalker.h |
diff --git a/third_party/WebKit/Source/core/fetch/ResourceClientOrObserverWalker.h b/third_party/WebKit/Source/core/fetch/ResourceClientWalker.h |
similarity index 59% |
rename from third_party/WebKit/Source/core/fetch/ResourceClientOrObserverWalker.h |
rename to third_party/WebKit/Source/core/fetch/ResourceClientWalker.h |
index 24f55046ea33c88d02641156630106a080d0a197..6a70072801d528c5f26bede82e7cef7182f97769 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceClientOrObserverWalker.h |
+++ b/third_party/WebKit/Source/core/fetch/ResourceClientWalker.h |
@@ -22,56 +22,52 @@ |
pages from the web. It has a memory cache for these objects. |
*/ |
-#ifndef ResourceClientOrObserverWalker_h |
-#define ResourceClientOrObserverWalker_h |
+#ifndef ResourceClientWalker_h |
+#define ResourceClientWalker_h |
#include "core/fetch/ResourceClient.h" |
+#include "platform/heap/Handle.h" |
#include "wtf/Allocator.h" |
-#include "wtf/HashCountedSet.h" |
-#include "wtf/Vector.h" |
namespace blink { |
// Call this "walker" instead of iterator so people won't expect Qt or STL-style iterator interface. |
// Just keep calling next() on this. It's safe from deletions of items. |
-// ClientOrObserver is either ResourceClient or ImageResourceObserver, so that |
-// this walker can be used both for ResourceClient and ImageResourceObserver. |
-template<typename ClientOrObserver, typename T> |
-class ResourceClientOrObserverWalker { |
+template<typename T> |
+struct ResourceClientWalker { |
haraken
2016/08/02 04:18:06
I'd prefer using a class.
(Honestly speaking, I'm
yhirano
2016/08/03 10:40:28
Done.
This class is doing two extra conversions:
haraken
2016/08/16 11:55:44
I'm just curious but why do you need to convert Re
yhirano
2016/08/17 08:36:09
The right direction would be making each Resource
|
STACK_ALLOCATED(); |
public: |
- explicit ResourceClientOrObserverWalker(const HashCountedSet<ClientOrObserver*>& set) |
- : m_clientSet(set), m_clientVector(set.size()), m_index(0) |
+ explicit ResourceClientWalker(const HeapHashCountedSet<WeakMember<ResourceClient>>& set) |
+ : m_clientSet(set) |
{ |
- size_t clientIndex = 0; |
- for (const auto& resourceClient : set) |
- m_clientVector[clientIndex++] = resourceClient.key; |
+ m_clientVector.reserveCapacity(set.size()); |
+ for (const auto& keyvalue : set) { |
+ ResourceClient* client = keyvalue.key; |
+ if (client) { |
+ // |client| can be null, as the container holds weak pointers. |
haraken
2016/08/02 04:18:06
I guess |client| cannot be null because null-ed en
yhirano
2016/08/03 10:40:28
Done.
|
+ m_clientVector.append(client); |
+ } |
+ } |
} |
T* next() |
{ |
size_t size = m_clientVector.size(); |
while (m_index < size) { |
- ClientOrObserver* next = m_clientVector[m_index++]; |
+ ResourceClient* next = m_clientVector[m_index++]; |
+ DCHECK(next); |
if (m_clientSet.contains(next)) { |
- ASSERT(T::isExpectedType(next)); |
+ DCHECK(T::isExpectedType(next)); |
return static_cast<T*>(next); |
} |
} |
- |
- return 0; |
+ return nullptr; |
} |
-private: |
- const HashCountedSet<ClientOrObserver*>& m_clientSet; |
- Vector<ClientOrObserver*> m_clientVector; |
- size_t m_index; |
-}; |
-template<typename T> |
-struct ResourceClientWalker : public ResourceClientOrObserverWalker<ResourceClient, T> { |
-public: |
- explicit ResourceClientWalker(const HashCountedSet<ResourceClient*>& set) |
- : ResourceClientOrObserverWalker<ResourceClient, T>(set) { } |
+private: |
+ const HeapHashCountedSet<WeakMember<ResourceClient>>& m_clientSet; |
+ HeapVector<Member<ResourceClient>> m_clientVector; |
+ size_t m_index = 0; |
}; |
} // namespace blink |