Index: Source/core/loader/ImageLoader.h |
diff --git a/Source/core/loader/ImageLoader.h b/Source/core/loader/ImageLoader.h |
index 1e0cdc426af7bc28729f3a8821b069c885551461..7ed593872f8c2c7482146ad0aa7b5796f205d52b 100644 |
--- a/Source/core/loader/ImageLoader.h |
+++ b/Source/core/loader/ImageLoader.h |
@@ -55,10 +55,11 @@ class RenderImageResource; |
template<typename T> class EventSender; |
typedef EventSender<ImageLoader> ImageEventSender; |
-class ImageLoader : public ImageResourceClient { |
+class ImageLoader : public NoBaseWillBeGarbageCollectedFinalized<ImageLoader>, public ImageResourceClient { |
public: |
explicit ImageLoader(Element*); |
virtual ~ImageLoader(); |
+ void trace(Visitor*); |
enum LoadType { |
LoadNormally, |
@@ -133,9 +134,14 @@ private: |
void willRemoveClient(ImageLoaderClient&); |
- Element* m_element; |
+ RawPtrWillBeMember<Element> m_element; |
ResourcePtr<ImageResource> m_image; |
#if ENABLE(OILPAN) |
+ // FIXME: Oilpan: We might be able to remove this hack when |
+ // ImageResourceClient is traceable. |
+ GC_PLUGIN_IGNORE("http://crbug.com/353083") |
+ Persistent<ImageLoader> m_keepAlive; |
+ |
class ImageLoaderClientRemover { |
public: |
ImageLoaderClientRemover(ImageLoader& loader, ImageLoaderClient& client) : m_loader(loader), m_client(client) { } |
@@ -146,6 +152,9 @@ private: |
ImageLoaderClient& m_client; |
}; |
friend class ImageLoaderClientRemover; |
+ // Oilpan: This ImageLoader object must outlive its clients because they |
+ // need to call ImageLoader::willRemoveClient before they die. |
+ GC_PLUGIN_IGNORE("http://crbug.com/353083") |
PersistentHeapHashMap<WeakMember<ImageLoaderClient>, OwnPtr<ImageLoaderClientRemover> > m_clients; |
haraken
2014/06/09 11:12:34
Why does this need to be a Persistent? It looks st
tkent
2014/06/10 01:43:09
The comment above explains it.
Tracing this is my
|
#else |
HashSet<ImageLoaderClient*> m_clients; |