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 |