Index: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp |
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp |
index 2b5eb6b93d4b19f34a9dcbbb709458564ef028b9..11c981c40518a2852efc971c4d3a0360c4afb0c2 100644 |
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp |
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp |
@@ -5,6 +5,7 @@ |
#include "config.h" |
#include "modules/canvas2d/CanvasRenderingContext2D.h" |
+#include "core/fetch/MemoryCache.h" |
#include "core/frame/FrameView.h" |
#include "core/frame/ImageBitmap.h" |
#include "core/html/HTMLCanvasElement.h" |
@@ -80,11 +81,13 @@ protected: |
CanvasRenderingContext2D* context2d() const { return static_cast<CanvasRenderingContext2D*>(canvasElement().renderingContext()); } |
void createContext(OpacityMode); |
+ void TearDown(); |
private: |
OwnPtr<DummyPageHolder> m_dummyPageHolder; |
RefPtrWillBePersistent<HTMLDocument> m_document; |
RefPtrWillBePersistent<HTMLCanvasElement> m_canvasElement; |
+ Persistent<MemoryCache> m_globalMemoryCache; |
class WrapGradients final : public NoBaseWillBeGarbageCollectedFinalized<WrapGradients> { |
public: |
@@ -159,6 +162,14 @@ void CanvasRenderingContext2DTest::SetUp() |
EXPECT_FALSE(exceptionState.hadException()); |
StringOrCanvasGradientOrCanvasPattern wrappedAlphaGradient; |
this->alphaGradient().setCanvasGradient(alphaGradient); |
+ |
+ m_globalMemoryCache = replaceMemoryCacheForTesting(MemoryCache::create()); |
+} |
+ |
+void CanvasRenderingContext2DTest::TearDown() |
+{ |
+ Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); |
+ replaceMemoryCacheForTesting(m_globalMemoryCache.release()); |
} |
//============================================================================ |
@@ -600,4 +611,22 @@ TEST_F(CanvasRenderingContext2DTest, FallbackWithLargeState) |
canvasElement().doDeferredPaintInvalidation(); // To close the current frame |
} |
+TEST_F(CanvasRenderingContext2DTest, ImageResourceLifetime) |
+{ |
+ RefPtrWillBeRawPtr<HTMLCanvasElement> canvasElement = HTMLCanvasElement::create(*Document::create().get()); |
+ canvasElement->setHeight(40); |
+ canvasElement->setWidth(40); |
+ RefPtrWillBeRawPtr<ImageBitmap> imageBitmapDerived = nullptr; |
+ { |
+ RefPtrWillBeRawPtr<ImageBitmap> imageBitmapFromCanvas = ImageBitmap::create(canvasElement.get(), IntRect(0, 0, canvasElement->width(), canvasElement->height())); |
+ imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), IntRect(0, 0, 20, 20)); |
+ } |
+ CanvasContextCreationAttributes attributes; |
+ CanvasRenderingContext2D* context = static_cast<CanvasRenderingContext2D*>(canvasElement->getCanvasRenderingContext("2d", attributes)); |
+ TrackExceptionState exceptionState; |
+ CanvasImageSourceUnion imageSource; |
+ imageSource.setImageBitmap(imageBitmapDerived); |
+ context->drawImage(imageSource, 0, 0, exceptionState); |
+} |
+ |
} // namespace blink |