Changeset 218038 in webkit
- Timestamp:
- Jun 9, 2017 7:51:05 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r218037 r218038 1 2017-06-09 Said Abou-Hallawa <sabouhallawa@apple.com> 2 3 Image should clear its ImageObserver* when CachedImage releases the last reference to its RefCounted<ImageObserver> 4 https://bugs.webkit.org/show_bug.cgi?id=173077 5 6 Reviewed by Simon Fraser. 7 8 Before dereferencing ImageObserver, CachedImage::clearImage() should check 9 whether it is the only object that holds a reference to this ImageObserver. 10 And if this is true, m_image have to clear its raw pointer to the deleted 11 ImageObserver by calling m_image->setImageObserver(nullptr). 12 13 * loader/cache/CachedImage.cpp: 14 (WebCore::CachedImage::setBodyDataFrom): 15 (WebCore::CachedImage::CachedImageObserver::CachedImageObserver): 16 (WebCore::CachedImage::clearImage): 17 * loader/cache/CachedImage.h: 18 1 19 2017-06-09 Daniel Bates <dabates@apple.com> 2 20 -
trunk/Source/WebCore/loader/cache/CachedImage.cpp
r218031 r218038 102 102 m_imageObserver = image.m_imageObserver; 103 103 if (m_imageObserver) 104 m_imageObserver-> add(*this);104 m_imageObserver->cachedImages().add(this); 105 105 106 106 if (m_image && is<SVGImage>(*m_image)) … … 327 327 CachedImage::CachedImageObserver::CachedImageObserver(CachedImage& image) 328 328 { 329 m_cachedImages.reserveInitialCapacity(1); 330 m_cachedImages.append(&image); 329 m_cachedImages.add(&image); 331 330 } 332 331 … … 368 367 inline void CachedImage::clearImage() 369 368 { 369 if (!m_image) 370 return; 371 370 372 if (m_imageObserver) { 371 m_imageObserver->remove(*this); 373 m_imageObserver->cachedImages().remove(this); 374 375 if (m_imageObserver->cachedImages().isEmpty()) { 376 ASSERT(m_imageObserver->hasOneRef()); 377 m_image->setImageObserver(nullptr); 378 } 379 372 380 m_imageObserver = nullptr; 373 381 } 382 374 383 m_image = nullptr; 375 384 } -
trunk/Source/WebCore/loader/cache/CachedImage.h
r218031 r218038 121 121 public: 122 122 static Ref<CachedImageObserver> create(CachedImage& image) { return adoptRef(*new CachedImageObserver(image)); } 123 void add(CachedImage& image) { m_cachedImages.append(&image); }124 void remove(CachedImage& image) { m_cachedImages.removeFirst(&image); }123 HashSet<CachedImage*>& cachedImages() { return m_cachedImages; } 124 const HashSet<CachedImage*>& cachedImages() const { return m_cachedImages; } 125 125 126 126 private: … … 128 128 129 129 // ImageObserver API 130 URL sourceUrl() const override { return !m_cachedImages.isEmpty() ? m_cachedImages[0]->url() : URL(); }130 URL sourceUrl() const override { return !m_cachedImages.isEmpty() ? (*m_cachedImages.begin())->url() : URL(); } 131 131 void decodedSizeChanged(const Image&, long long delta) final; 132 132 void didDraw(const Image&) final; … … 136 136 void changedInRect(const Image&, const IntRect*) final; 137 137 138 Vector<CachedImage*> m_cachedImages;138 HashSet<CachedImage*> m_cachedImages; 139 139 }; 140 140
Note: See TracChangeset
for help on using the changeset viewer.