| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013, Google Inc. All rights reserved. | 2 * Copyright (c) 2013, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 #include "core/fetch/ImageResource.h" | 37 #include "core/fetch/ImageResource.h" |
| 38 #include "core/fetch/MemoryCache.h" | 38 #include "core/fetch/MemoryCache.h" |
| 39 #include "core/fetch/MockImageResourceClient.h" | 39 #include "core/fetch/MockImageResourceClient.h" |
| 40 #include "core/fetch/ResourcePtr.h" | 40 #include "core/fetch/ResourcePtr.h" |
| 41 #include "core/html/HTMLCanvasElement.h" | 41 #include "core/html/HTMLCanvasElement.h" |
| 42 #include "core/html/HTMLImageElement.h" | 42 #include "core/html/HTMLImageElement.h" |
| 43 #include "core/html/HTMLVideoElement.h" | 43 #include "core/html/HTMLVideoElement.h" |
| 44 #include "core/html/canvas/CanvasRenderingContext2D.h" | 44 #include "core/html/canvas/CanvasRenderingContext2D.h" |
| 45 #include "core/html/canvas/WebGLRenderingContext.h" | 45 #include "core/html/canvas/WebGLRenderingContext.h" |
| 46 #include "platform/graphics/BitmapImage.h" | 46 #include "platform/graphics/BitmapImage.h" |
| 47 #include "platform/graphics/skia/NativeImageSkia.h" | |
| 48 #include "platform/heap/Handle.h" | 47 #include "platform/heap/Handle.h" |
| 49 #include "platform/network/ResourceRequest.h" | 48 #include "platform/network/ResourceRequest.h" |
| 50 #include "wtf/OwnPtr.h" | 49 #include "wtf/OwnPtr.h" |
| 51 | 50 |
| 52 #include <gtest/gtest.h> | 51 #include <gtest/gtest.h> |
| 53 | 52 |
| 54 namespace blink { | 53 namespace blink { |
| 55 | 54 |
| 56 class ImageBitmapTest : public ::testing::Test { | 55 class ImageBitmapTest : public ::testing::Test { |
| 57 protected: | 56 protected: |
| (...skipping 20 matching lines...) Expand all Loading... |
| 78 | 77 |
| 79 SkBitmap m_bitmap, m_bitmap2; | 78 SkBitmap m_bitmap, m_bitmap2; |
| 80 OwnPtrWillBePersistent<MemoryCache> m_globalMemoryCache; | 79 OwnPtrWillBePersistent<MemoryCache> m_globalMemoryCache; |
| 81 }; | 80 }; |
| 82 | 81 |
| 83 // Verifies that the image resource held by an ImageBitmap is the same as the | 82 // Verifies that the image resource held by an ImageBitmap is the same as the |
| 84 // one held by the HTMLImageElement. | 83 // one held by the HTMLImageElement. |
| 85 TEST_F(ImageBitmapTest, ImageResourceConsistency) | 84 TEST_F(ImageBitmapTest, ImageResourceConsistency) |
| 86 { | 85 { |
| 87 RefPtrWillBeRawPtr<HTMLImageElement> imageElement = HTMLImageElement::create
(*Document::create().get()); | 86 RefPtrWillBeRawPtr<HTMLImageElement> imageElement = HTMLImageElement::create
(*Document::create().get()); |
| 88 imageElement->setImageResource(new ImageResource(BitmapImage::create(NativeI
mageSkia::create(m_bitmap)).get())); | 87 imageElement->setImageResource(new ImageResource(BitmapImage::create(m_bitma
p).get())); |
| 89 | 88 |
| 90 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(imag
eElement.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); | 89 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(imag
eElement.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); |
| 91 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapInteriorCrop = ImageBitmap::creat
e(imageElement.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bit
map.width() / 2, m_bitmap.height() / 2)); | 90 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapInteriorCrop = ImageBitmap::creat
e(imageElement.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bit
map.width() / 2, m_bitmap.height() / 2)); |
| 92 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapExteriorCrop = ImageBitmap::creat
e(imageElement.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_b
itmap.width(), m_bitmap.height())); | 91 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapExteriorCrop = ImageBitmap::creat
e(imageElement.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_b
itmap.width(), m_bitmap.height())); |
| 93 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapOutsideCrop = ImageBitmap::create
(imageElement.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.wid
th(), m_bitmap.height())); | 92 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapOutsideCrop = ImageBitmap::create
(imageElement.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.wid
th(), m_bitmap.height())); |
| 94 | 93 |
| 95 ASSERT_EQ(imageBitmapNoCrop->bitmapImage().get(), imageElement->cachedImage(
)->image()); | 94 ASSERT_EQ(imageBitmapNoCrop->bitmapImage().get(), imageElement->cachedImage(
)->image()); |
| 96 ASSERT_EQ(imageBitmapInteriorCrop->bitmapImage().get(), imageElement->cached
Image()->image()); | 95 ASSERT_EQ(imageBitmapInteriorCrop->bitmapImage().get(), imageElement->cached
Image()->image()); |
| 97 ASSERT_EQ(imageBitmapExteriorCrop->bitmapImage().get(), imageElement->cached
Image()->image()); | 96 ASSERT_EQ(imageBitmapExteriorCrop->bitmapImage().get(), imageElement->cached
Image()->image()); |
| 98 | 97 |
| 99 RefPtr<Image> emptyImage = imageBitmapOutsideCrop->bitmapImage(); | 98 RefPtr<Image> emptyImage = imageBitmapOutsideCrop->bitmapImage(); |
| 100 ASSERT_NE(emptyImage.get(), imageElement->cachedImage()->image()); | 99 ASSERT_NE(emptyImage.get(), imageElement->cachedImage()->image()); |
| 101 } | 100 } |
| 102 | 101 |
| 103 // Verifies that HTMLImageElements are given an elevated CacheLiveResourcePriori
ty when used to construct an ImageBitmap. | 102 // Verifies that HTMLImageElements are given an elevated CacheLiveResourcePriori
ty when used to construct an ImageBitmap. |
| 104 // ImageBitmaps that have crop rects outside of the bounds of the HTMLImageEleme
nt do not have elevated CacheLiveResourcePriority. | 103 // ImageBitmaps that have crop rects outside of the bounds of the HTMLImageEleme
nt do not have elevated CacheLiveResourcePriority. |
| 105 TEST_F(ImageBitmapTest, ImageBitmapLiveResourcePriority) | 104 TEST_F(ImageBitmapTest, ImageBitmapLiveResourcePriority) |
| 106 { | 105 { |
| 107 RefPtrWillBePersistent<HTMLImageElement> imageNoCrop = HTMLImageElement::cre
ate(*Document::create().get()); | 106 RefPtrWillBePersistent<HTMLImageElement> imageNoCrop = HTMLImageElement::cre
ate(*Document::create().get()); |
| 108 ResourcePtr<ImageResource> cachedImageNoCrop = new ImageResource(ResourceReq
uest("http://foo.com/1"), BitmapImage::create(NativeImageSkia::create(m_bitmap))
.get()); | 107 ResourcePtr<ImageResource> cachedImageNoCrop = new ImageResource(ResourceReq
uest("http://foo.com/1"), BitmapImage::create(m_bitmap).get()); |
| 109 imageNoCrop->setImageResource(cachedImageNoCrop.get()); | 108 imageNoCrop->setImageResource(cachedImageNoCrop.get()); |
| 110 | 109 |
| 111 RefPtrWillBePersistent<HTMLImageElement> imageInteriorCrop = HTMLImageElemen
t::create(*Document::create().get()); | 110 RefPtrWillBePersistent<HTMLImageElement> imageInteriorCrop = HTMLImageElemen
t::create(*Document::create().get()); |
| 112 ResourcePtr<ImageResource> cachedImageInteriorCrop = new ImageResource(Resou
rceRequest("http://foo.com/2"), BitmapImage::create(NativeImageSkia::create(m_bi
tmap)).get()); | 111 ResourcePtr<ImageResource> cachedImageInteriorCrop = new ImageResource(Resou
rceRequest("http://foo.com/2"), BitmapImage::create(m_bitmap).get()); |
| 113 imageInteriorCrop->setImageResource(cachedImageInteriorCrop.get()); | 112 imageInteriorCrop->setImageResource(cachedImageInteriorCrop.get()); |
| 114 | 113 |
| 115 RefPtrWillBePersistent<HTMLImageElement> imageExteriorCrop = HTMLImageElemen
t::create(*Document::create().get()); | 114 RefPtrWillBePersistent<HTMLImageElement> imageExteriorCrop = HTMLImageElemen
t::create(*Document::create().get()); |
| 116 ResourcePtr<ImageResource> cachedImageExteriorCrop = new ImageResource(Resou
rceRequest("http://foo.com/3"), BitmapImage::create(NativeImageSkia::create(m_bi
tmap)).get()); | 115 ResourcePtr<ImageResource> cachedImageExteriorCrop = new ImageResource(Resou
rceRequest("http://foo.com/3"), BitmapImage::create(m_bitmap).get()); |
| 117 imageExteriorCrop->setImageResource(cachedImageExteriorCrop.get()); | 116 imageExteriorCrop->setImageResource(cachedImageExteriorCrop.get()); |
| 118 | 117 |
| 119 RefPtrWillBePersistent<HTMLImageElement> imageOutsideCrop = HTMLImageElement
::create(*Document::create().get()); | 118 RefPtrWillBePersistent<HTMLImageElement> imageOutsideCrop = HTMLImageElement
::create(*Document::create().get()); |
| 120 ResourcePtr<ImageResource> cachedImageOutsideCrop = new ImageResource(Resour
ceRequest("http://foo.com/4"), BitmapImage::create(NativeImageSkia::create(m_bit
map)).get()); | 119 ResourcePtr<ImageResource> cachedImageOutsideCrop = new ImageResource(Resour
ceRequest("http://foo.com/4"), BitmapImage::create(m_bitmap).get()); |
| 121 imageOutsideCrop->setImageResource(cachedImageOutsideCrop.get()); | 120 imageOutsideCrop->setImageResource(cachedImageOutsideCrop.get()); |
| 122 | 121 |
| 123 MockImageResourceClient mockClient1, mockClient2, mockClient3, mockClient4; | 122 MockImageResourceClient mockClient1, mockClient2, mockClient3, mockClient4; |
| 124 cachedImageNoCrop->addClient(&mockClient1); | 123 cachedImageNoCrop->addClient(&mockClient1); |
| 125 cachedImageInteriorCrop->addClient(&mockClient2); | 124 cachedImageInteriorCrop->addClient(&mockClient2); |
| 126 cachedImageExteriorCrop->addClient(&mockClient3); | 125 cachedImageExteriorCrop->addClient(&mockClient3); |
| 127 cachedImageOutsideCrop->addClient(&mockClient4); | 126 cachedImageOutsideCrop->addClient(&mockClient4); |
| 128 | 127 |
| 129 memoryCache()->add(cachedImageNoCrop.get()); | 128 memoryCache()->add(cachedImageNoCrop.get()); |
| 130 memoryCache()->add(cachedImageInteriorCrop.get()); | 129 memoryCache()->add(cachedImageInteriorCrop.get()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 cachedImageNoCrop->removeClient(&mockClient1); | 170 cachedImageNoCrop->removeClient(&mockClient1); |
| 172 cachedImageInteriorCrop->removeClient(&mockClient2); | 171 cachedImageInteriorCrop->removeClient(&mockClient2); |
| 173 cachedImageExteriorCrop->removeClient(&mockClient3); | 172 cachedImageExteriorCrop->removeClient(&mockClient3); |
| 174 cachedImageOutsideCrop->removeClient(&mockClient4); | 173 cachedImageOutsideCrop->removeClient(&mockClient4); |
| 175 } | 174 } |
| 176 | 175 |
| 177 // Verifies that ImageBitmaps constructed from HTMLImageElements hold a referenc
e to the original Image if the HTMLImageElement src is changed. | 176 // Verifies that ImageBitmaps constructed from HTMLImageElements hold a referenc
e to the original Image if the HTMLImageElement src is changed. |
| 178 TEST_F(ImageBitmapTest, ImageBitmapSourceChanged) | 177 TEST_F(ImageBitmapTest, ImageBitmapSourceChanged) |
| 179 { | 178 { |
| 180 RefPtrWillBeRawPtr<HTMLImageElement> image = HTMLImageElement::create(*Docum
ent::create().get()); | 179 RefPtrWillBeRawPtr<HTMLImageElement> image = HTMLImageElement::create(*Docum
ent::create().get()); |
| 181 ResourcePtr<ImageResource> originalImageResource = new ImageResource(BitmapI
mage::create(NativeImageSkia::create(m_bitmap)).get()); | 180 ResourcePtr<ImageResource> originalImageResource = new ImageResource(BitmapI
mage::create(m_bitmap).get()); |
| 182 image->setImageResource(originalImageResource.get()); | 181 image->setImageResource(originalImageResource.get()); |
| 183 | 182 |
| 184 RefPtrWillBeRawPtr<ImageBitmap> imageBitmap = ImageBitmap::create(image.get(
), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); | 183 RefPtrWillBeRawPtr<ImageBitmap> imageBitmap = ImageBitmap::create(image.get(
), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); |
| 185 ASSERT_EQ(imageBitmap->bitmapImage().get(), originalImageResource->image()); | 184 ASSERT_EQ(imageBitmap->bitmapImage().get(), originalImageResource->image()); |
| 186 | 185 |
| 187 ResourcePtr<ImageResource> newImageResource = new ImageResource(BitmapImage:
:create(NativeImageSkia::create(m_bitmap2)).get()); | 186 ResourcePtr<ImageResource> newImageResource = new ImageResource(BitmapImage:
:create(m_bitmap2).get()); |
| 188 image->setImageResource(newImageResource.get()); | 187 image->setImageResource(newImageResource.get()); |
| 189 | 188 |
| 190 // The ImageBitmap should contain the same data as the original cached image
but should no longer hold a reference. | 189 // The ImageBitmap should contain the same data as the original cached image
but should no longer hold a reference. |
| 191 ASSERT_NE(imageBitmap->bitmapImage().get(), originalImageResource->image()); | 190 ASSERT_NE(imageBitmap->bitmapImage().get(), originalImageResource->image()); |
| 192 ASSERT_EQ(imageBitmap->bitmapImage()->nativeImageForCurrentFrame()->bitmap()
.pixelRef()->pixels(), | 191 SkBitmap bitmap1, bitmap2; |
| 193 originalImageResource->image()->nativeImageForCurrentFrame()->bitmap().p
ixelRef()->pixels()); | 192 ASSERT_TRUE(imageBitmap->bitmapImage()->bitmapForCurrentFrame(&bitmap1)); |
| 193 ASSERT_TRUE(originalImageResource->image()->bitmapForCurrentFrame(&bitmap2))
; |
| 194 ASSERT_EQ(bitmap1.pixelRef()->pixels(), bitmap2.pixelRef()->pixels()); |
| 194 | 195 |
| 195 ASSERT_NE(imageBitmap->bitmapImage().get(), newImageResource->image()); | 196 ASSERT_NE(imageBitmap->bitmapImage().get(), newImageResource->image()); |
| 196 ASSERT_NE(imageBitmap->bitmapImage()->nativeImageForCurrentFrame()->bitmap()
.pixelRef()->pixels(), | 197 ASSERT_TRUE(imageBitmap->bitmapImage()->bitmapForCurrentFrame(&bitmap1)); |
| 197 newImageResource->image()->nativeImageForCurrentFrame()->bitmap().pixelR
ef()->pixels()); | 198 ASSERT_TRUE(newImageResource->image()->bitmapForCurrentFrame(&bitmap2)); |
| 199 ASSERT_NE(bitmap1.pixelRef()->pixels(), bitmap2.pixelRef()->pixels()); |
| 198 } | 200 } |
| 199 | 201 |
| 200 // Verifies that ImageBitmaps constructed from ImageBitmaps hold onto their own
Image. | 202 // Verifies that ImageBitmaps constructed from ImageBitmaps hold onto their own
Image. |
| 201 TEST_F(ImageBitmapTest, ImageResourceLifetime) | 203 TEST_F(ImageBitmapTest, ImageResourceLifetime) |
| 202 { | 204 { |
| 203 RefPtrWillBeRawPtr<HTMLCanvasElement> canvasElement = HTMLCanvasElement::cre
ate(*Document::create().get()); | 205 RefPtrWillBeRawPtr<HTMLCanvasElement> canvasElement = HTMLCanvasElement::cre
ate(*Document::create().get()); |
| 204 canvasElement->setHeight(40); | 206 canvasElement->setHeight(40); |
| 205 canvasElement->setWidth(40); | 207 canvasElement->setWidth(40); |
| 206 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapDerived = nullptr; | 208 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapDerived = nullptr; |
| 207 { | 209 { |
| 208 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapFromCanvas = ImageBitmap::cre
ate(canvasElement.get(), IntRect(0, 0, canvasElement->width(), canvasElement->he
ight())); | 210 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapFromCanvas = ImageBitmap::cre
ate(canvasElement.get(), IntRect(0, 0, canvasElement->width(), canvasElement->he
ight())); |
| 209 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), In
tRect(0, 0, 20, 20)); | 211 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), In
tRect(0, 0, 20, 20)); |
| 210 } | 212 } |
| 211 CanvasContextCreationAttributes attributes; | 213 CanvasContextCreationAttributes attributes; |
| 212 CanvasRenderingContext2DOrWebGLRenderingContext context; | 214 CanvasRenderingContext2DOrWebGLRenderingContext context; |
| 213 canvasElement->getContext("2d", attributes, context); | 215 canvasElement->getContext("2d", attributes, context); |
| 214 TrackExceptionState exceptionState; | 216 TrackExceptionState exceptionState; |
| 215 CanvasImageSourceUnion imageSource; | 217 CanvasImageSourceUnion imageSource; |
| 216 imageSource.setImageBitmap(imageBitmapDerived); | 218 imageSource.setImageBitmap(imageBitmapDerived); |
| 217 context.getAsCanvasRenderingContext2D()->drawImage(imageSource, 0, 0, except
ionState); | 219 context.getAsCanvasRenderingContext2D()->drawImage(imageSource, 0, 0, except
ionState); |
| 218 } | 220 } |
| 219 | 221 |
| 220 } // namespace | 222 } // namespace |
| OLD | NEW |