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);

    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());
}