Chromium Code Reviews

Unified Diff: Source/core/frame/ImageBitmapTest.cpp

Issue 190183003: Oilpan: move ImageBitmap to the oilpan heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Have ImageLoader keep a persistent set of ImageLoaderClients Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: Source/core/frame/ImageBitmapTest.cpp
diff --git a/Source/core/frame/ImageBitmapTest.cpp b/Source/core/frame/ImageBitmapTest.cpp
index 6a6626ae7ab089d693e780761ea1fe4570191f76..acf6fc177d835b6cd41c3e5c3bf1ceec3e4bd553 100644
--- a/Source/core/frame/ImageBitmapTest.cpp
+++ b/Source/core/frame/ImageBitmapTest.cpp
@@ -81,6 +81,48 @@ protected:
OwnPtr<MemoryCache> m_globalMemoryCache;
};
+// SetUp() installs a memory cache per test, which means the image
+// resources that a test adds has to be removed before the cache is
+// torn down and replaced. As a consequence of ImageBitmaps being
+// allocated on a GCed heap (with Oilpan enabled), we have to
+// explicitly detach their resources upon test completion to achieve
+// such timely removal. The AutoImageBitmap wrapper class takes
+// care of this.
+//
+// NOTE: if a test creates ImageBitmaps, it must involve this wrapper
+// class, unless it explicitly calls detach(). If not, expect to see
+// asserts when a ImageBitmap is later on GCed and it tries to remove
+// itself from another MemoryCache.
+//
+class AutoImageBitmap {
haraken 2014/03/10 15:25:03 I'm not fully convinced why we need AutoImageBitma
sof 2014/03/10 15:55:57 I considered triggering a GC for each test too blu
haraken 2014/03/10 16:04:55 We were doing that in the experimental branch. Ma
sof 2014/03/10 21:07:21 I see; if preferable, I'll switch over of course.
sof 2014/03/12 10:02:25 Need to make a choice here between: - The test T
Erik Corry 2014/03/12 10:06:15 My feeling is that an explicit call to GC in the t
haraken 2014/03/12 10:34:09 Agreed.
+ STACK_ALLOCATED();
+public:
+ AutoImageBitmap()
+ {
+ }
+
+ AutoImageBitmap(const PassRefPtrWillBeRawPtr<ImageBitmap>& imageBitmap)
+ {
+ m_imageBitmap = imageBitmap;
+ }
+
+ AutoImageBitmap(const AutoImageBitmap& other)
+ {
+ m_imageBitmap = other.m_imageBitmap;
+ }
+
+ ~AutoImageBitmap()
+ {
+ m_imageBitmap->detach();
haraken 2014/03/10 15:25:03 This looks dangerous. AutoImageBitmap is on-heap (
sof 2014/03/10 15:55:57 It's on the stack and not finalized; what is the c
haraken 2014/03/10 16:04:55 Sorry, you're right.
+ }
+
+ ImageBitmap* get() const { return m_imageBitmap.get(); }
+ RefPtrWillBeRawPtr<ImageBitmap> operator->() const { return m_imageBitmap; }
+
+private:
+ RefPtrWillBeMember<ImageBitmap> m_imageBitmap;
haraken 2014/03/10 15:25:03 This can be RefPtrWillBeRawPtr because AutoImageBi
sof 2014/03/10 21:07:21 I've switched to that representation, but am curio
Erik Corry 2014/03/10 21:18:56 I'm not sure, actually. For bare stack allocated
+};
+
// Verifies that the image resource held by an ImageBitmap is the same as the
// one held by the HTMLImageElement.
TEST_F(ImageBitmapTest, ImageResourceConsistency)
@@ -88,10 +130,10 @@ TEST_F(ImageBitmapTest, ImageResourceConsistency)
RefPtr<HTMLImageElement> imageElement = HTMLImageElement::create(*Document::create().get());
imageElement->setImageResource(new ImageResource(BitmapImage::create(NativeImageSkia::create(m_bitmap)).get()));
- RefPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(imageElement.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height()));
- RefPtr<ImageBitmap> imageBitmapInteriorCrop = ImageBitmap::create(imageElement.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitmap.width() / 2, m_bitmap.height() / 2));
- RefPtr<ImageBitmap> imageBitmapExteriorCrop = ImageBitmap::create(imageElement.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_bitmap.width(), m_bitmap.height()));
- RefPtr<ImageBitmap> imageBitmapOutsideCrop = ImageBitmap::create(imageElement.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmapNoCrop = ImageBitmap::create(imageElement.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmapInteriorCrop = ImageBitmap::create(imageElement.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitmap.width() / 2, m_bitmap.height() / 2));
+ AutoImageBitmap imageBitmapExteriorCrop = ImageBitmap::create(imageElement.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmapOutsideCrop = ImageBitmap::create(imageElement.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.width(), m_bitmap.height()));
ASSERT_EQ(imageBitmapNoCrop->bitmapImage().get(), imageElement->cachedImage()->image());
ASSERT_EQ(imageBitmapInteriorCrop->bitmapImage().get(), imageElement->cachedImage()->image());
@@ -142,12 +184,12 @@ TEST_F(ImageBitmapTest, ImageBitmapLiveResourcePriority)
ASSERT_EQ(imageExteriorCrop->cachedImage()->cacheLiveResourcePriority(), Resource::CacheLiveResourcePriorityLow);
ASSERT_EQ(imageOutsideCrop->cachedImage()->cacheLiveResourcePriority(), Resource::CacheLiveResourcePriorityLow);
- RefPtr<ImageBitmap> imageBitmapInteriorCrop = ImageBitmap::create(imageInteriorCrop.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmapInteriorCrop = ImageBitmap::create(imageInteriorCrop.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitmap.width(), m_bitmap.height()));
{
- RefPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(imageNoCrop.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height()));
- RefPtr<ImageBitmap> imageBitmapInteriorCrop2 = ImageBitmap::create(imageInteriorCrop.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitmap.width(), m_bitmap.height()));
- RefPtr<ImageBitmap> imageBitmapExteriorCrop = ImageBitmap::create(imageExteriorCrop.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_bitmap.width(), m_bitmap.height()));
- RefPtr<ImageBitmap> imageBitmapOutsideCrop = ImageBitmap::create(imageOutsideCrop.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmapNoCrop = ImageBitmap::create(imageNoCrop.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmapInteriorCrop2 = ImageBitmap::create(imageInteriorCrop.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmapExteriorCrop = ImageBitmap::create(imageExteriorCrop.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmapOutsideCrop = ImageBitmap::create(imageOutsideCrop.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.width(), m_bitmap.height()));
// Images that are referenced by ImageBitmaps have CacheLiveResourcePriorityHigh.
ASSERT_EQ(imageNoCrop->cachedImage()->cacheLiveResourcePriority(), Resource::CacheLiveResourcePriorityHigh);
@@ -174,7 +216,7 @@ TEST_F(ImageBitmapTest, ImageBitmapSourceChanged)
ResourcePtr<ImageResource> originalImageResource = new ImageResource(BitmapImage::create(NativeImageSkia::create(m_bitmap)).get());
image->setImageResource(originalImageResource.get());
- RefPtr<ImageBitmap> imageBitmap = ImageBitmap::create(image.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height()));
+ AutoImageBitmap imageBitmap = ImageBitmap::create(image.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height()));
ASSERT_EQ(imageBitmap->bitmapImage().get(), originalImageResource->image());
ResourcePtr<ImageResource> newImageResource = new ImageResource(BitmapImage::create(NativeImageSkia::create(m_bitmap2)).get());
@@ -196,9 +238,9 @@ TEST_F(ImageBitmapTest, ImageResourceLifetime)
RefPtr<HTMLCanvasElement> canvasElement = HTMLCanvasElement::create(*Document::create().get());
canvasElement->setHeight(40);
canvasElement->setWidth(40);
- RefPtr<ImageBitmap> imageBitmapDerived;
+ AutoImageBitmap imageBitmapDerived;
{
- RefPtr<ImageBitmap> imageBitmapFromCanvas = ImageBitmap::create(canvasElement.get(), IntRect(0, 0, canvasElement->width(), canvasElement->height()));
+ AutoImageBitmap imageBitmapFromCanvas = ImageBitmap::create(canvasElement.get(), IntRect(0, 0, canvasElement->width(), canvasElement->height()));
imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), IntRect(0, 0, 20, 20));
}
CanvasRenderingContext* context = canvasElement->getContext("2d");

Powered by Google App Engine