TEST(ImageResourceTest, DecodedDataRemainsWhileHasClients) { ImageResource* cachedImage = ImageResource::create(ResourceRequest()); cachedImage->setStatus(Resource::Pending); Persistent<MockImageResourceClient> client = new MockImageResourceClient(cachedImage); // Send the image response. cachedImage->responseReceived(ResourceResponse(KURL(), "multipart/x-mixed-replace", 0, nullAtom, String()), nullptr); Vector<unsigned char> jpeg = jpegImage(); cachedImage->responseReceived(ResourceResponse(KURL(), "image/jpeg", jpeg.size(), nullAtom, String()), nullptr); cachedImage->appendData(reinterpret_cast<const char*>(jpeg.data()), jpeg.size()); cachedImage->finish(); ASSERT_FALSE(cachedImage->errorOccurred()); ASSERT_TRUE(cachedImage->hasImage()); ASSERT_FALSE(cachedImage->getImage()->isNull()); ASSERT_TRUE(client->notifyFinishedCalled()); // The prune comes when the ImageResource still has clients. The image should not be deleted. cachedImage->prune(); ASSERT_TRUE(cachedImage->hasClientsOrObservers()); ASSERT_TRUE(cachedImage->hasImage()); ASSERT_FALSE(cachedImage->getImage()->isNull()); // The ImageResource no longer has clients. The image should be deleted by prune. client->removeAsClient(); cachedImage->prune(); ASSERT_FALSE(cachedImage->hasClientsOrObservers()); ASSERT_FALSE(cachedImage->hasImage()); ASSERT_TRUE(cachedImage->getImage()->isNull()); }
TEST(ImageResourceTest, AddClientAfterPrune) { KURL url(ParsedURLString, "http://127.0.0.1:8000/foo"); ImageResource* imageResource = ImageResource::create(ResourceRequest(url)); // Adds a ResourceClient but not ImageResourceObserver. Persistent<MockResourceClient> client1 = new MockResourceClient(imageResource); receiveResponse(imageResource, url, "image/jpeg", jpegImage()); EXPECT_FALSE(imageResource->errorOccurred()); ASSERT_TRUE(imageResource->hasImage()); EXPECT_FALSE(imageResource->getImage()->isNull()); EXPECT_EQ(1, imageResource->getImage()->width()); EXPECT_EQ(1, imageResource->getImage()->height()); EXPECT_TRUE(client1->notifyFinishedCalled()); client1->removeAsClient(); EXPECT_FALSE(imageResource->isAlive()); imageResource->prune(); EXPECT_TRUE(imageResource->hasImage()); // Re-adds a ResourceClient but not ImageResourceObserver. Persistent<MockResourceClient> client2 = new MockResourceClient(imageResource); ASSERT_TRUE(imageResource->hasImage()); EXPECT_FALSE(imageResource->getImage()->isNull()); EXPECT_EQ(1, imageResource->getImage()->width()); EXPECT_EQ(1, imageResource->getImage()->height()); EXPECT_TRUE(client2->notifyFinishedCalled()); }
TEST(ImageResourceTest, AddClientAfterPrune) { KURL url(ParsedURLString, "http://127.0.0.1:8000/foo"); ImageResource* imageResource = ImageResource::create(ResourceRequest(url)); // Adds a ResourceClient but not ImageResourceObserver. Persistent<MockResourceClient> client1 = new MockResourceClient(imageResource); Vector<unsigned char> jpeg = jpegImage(); ResourceResponse response; response.setURL(url); response.setHTTPStatusCode(200); response.setMimeType("image/jpeg"); imageResource->responseReceived(response, nullptr); imageResource->appendData(reinterpret_cast<const char*>(jpeg.data()), jpeg.size()); imageResource->finish(); EXPECT_FALSE(imageResource->errorOccurred()); ASSERT_TRUE(imageResource->hasImage()); EXPECT_FALSE(imageResource->getImage()->isNull()); EXPECT_EQ(1, imageResource->getImage()->width()); EXPECT_EQ(1, imageResource->getImage()->height()); EXPECT_TRUE(client1->notifyFinishedCalled()); client1->removeAsClient(); EXPECT_FALSE(imageResource->hasClientsOrObservers()); imageResource->prune(); EXPECT_FALSE(imageResource->hasImage()); // Re-adds a ResourceClient but not ImageResourceObserver. Persistent<MockResourceClient> client2 = new MockResourceClient(imageResource); ASSERT_TRUE(imageResource->hasImage()); EXPECT_FALSE(imageResource->getImage()->isNull()); EXPECT_EQ(1, imageResource->getImage()->width()); EXPECT_EQ(1, imageResource->getImage()->height()); EXPECT_TRUE(client2->notifyFinishedCalled()); }