| Index: Source/core/fetch/RawResourceTest.cpp
|
| diff --git a/Source/core/fetch/RawResourceTest.cpp b/Source/core/fetch/RawResourceTest.cpp
|
| index 3c4d009947947d01a0fb91fd109987be0a49a197..f51ff48186302589c2d58aa068ee4ec6ecd46ac9 100644
|
| --- a/Source/core/fetch/RawResourceTest.cpp
|
| +++ b/Source/core/fetch/RawResourceTest.cpp
|
| @@ -47,7 +47,7 @@
|
|
|
| using namespace WebCore;
|
|
|
| -namespace {
|
| +namespace WebCore {
|
|
|
| TEST(RawResourceTest, DontIgnoreAcceptForCacheReuse)
|
| {
|
| @@ -86,4 +86,105 @@ TEST(RawResourceTest, RevalidationSucceeded)
|
| EXPECT_NE(newResource.get(), newResourcePointer);
|
| }
|
|
|
| -} // namespace
|
| +class DummyClient : public RawResourceClient {
|
| +public:
|
| + DummyClient() : m_called(false) { }
|
| + virtual ~DummyClient() { }
|
| +
|
| + // ResourceClient implementation.
|
| + virtual void notifyFinished(Resource* resource)
|
| + {
|
| + m_called = true;
|
| + }
|
| +
|
| + bool called() { return m_called; }
|
| +private:
|
| + bool m_called;
|
| +};
|
| +
|
| +// This client adds another client when notified.
|
| +class AddingClient : public RawResourceClient {
|
| +public:
|
| + AddingClient(DummyClient* client, Resource* resource)
|
| + : m_dummyClient(client)
|
| + , m_resource(resource)
|
| + , m_removeClientTimer(this, &AddingClient::removeClient) { }
|
| +
|
| + virtual ~AddingClient() { }
|
| +
|
| + // ResourceClient implementation.
|
| + virtual void notifyFinished(Resource* resource)
|
| + {
|
| + // First schedule an asynchronous task to remove the client.
|
| + // We do not expect the client to be called.
|
| + m_removeClientTimer.startOneShot(0, FROM_HERE);
|
| + resource->addClient(m_dummyClient);
|
| + }
|
| + void removeClient(Timer<AddingClient>* timer)
|
| + {
|
| + m_resource->removeClient(m_dummyClient);
|
| + }
|
| +private:
|
| + DummyClient* m_dummyClient;
|
| + Resource* m_resource;
|
| + Timer<AddingClient> m_removeClientTimer;
|
| +};
|
| +
|
| +TEST(RawResourceTest, AddClientDuringCallback)
|
| +{
|
| + ResourcePtr<Resource> raw = new RawResource(ResourceRequest("data:text/html,"), Resource::Raw);
|
| + raw->setLoading(false);
|
| +
|
| + // Create a non-null response.
|
| + ResourceResponse response = raw->response();
|
| + response.setURL(KURL(ParsedURLString, "http://600.613/"));
|
| + raw->setResponse(response);
|
| + EXPECT_FALSE(raw->response().isNull());
|
| +
|
| + OwnPtr<DummyClient> dummyClient = adoptPtr(new DummyClient());
|
| + OwnPtr<AddingClient> addingClient = adoptPtr(new AddingClient(dummyClient.get(), raw.get()));
|
| + raw->addClient(addingClient.get());
|
| + testing::runPendingTasks();
|
| + raw->removeClient(addingClient.get());
|
| + EXPECT_FALSE(dummyClient->called());
|
| + EXPECT_FALSE(raw->hasClients());
|
| +}
|
| +
|
| +// This client removes another client when notified.
|
| +class RemovingClient : public RawResourceClient {
|
| +public:
|
| + RemovingClient(DummyClient* client)
|
| + : m_dummyClient(client) { }
|
| +
|
| + virtual ~RemovingClient() { }
|
| +
|
| + // ResourceClient implementation.
|
| + virtual void notifyFinished(Resource* resource)
|
| + {
|
| + resource->removeClient(m_dummyClient);
|
| + resource->removeClient(this);
|
| + }
|
| +private:
|
| + DummyClient* m_dummyClient;
|
| +};
|
| +
|
| +TEST(RawResourceTest, RemoveClientDuringCallback)
|
| +{
|
| + ResourcePtr<Resource> raw = new RawResource(ResourceRequest("data:text/html,"), Resource::Raw);
|
| + raw->setLoading(false);
|
| +
|
| + // Create a non-null response.
|
| + ResourceResponse response = raw->response();
|
| + response.setURL(KURL(ParsedURLString, "http://600.613/"));
|
| + raw->setResponse(response);
|
| + EXPECT_FALSE(raw->response().isNull());
|
| +
|
| + OwnPtr<DummyClient> dummyClient = adoptPtr(new DummyClient());
|
| + OwnPtr<RemovingClient> removingClient = adoptPtr(new RemovingClient(dummyClient.get()));
|
| + raw->addClient(dummyClient.get());
|
| + raw->addClient(removingClient.get());
|
| + testing::runPendingTasks();
|
| + EXPECT_FALSE(raw->hasClients());
|
| +}
|
| +
|
| +} // namespace WebCore
|
|
|