| Index: Source/core/loader/cache/CachedImageTest.cpp
|
| diff --git a/Source/core/loader/cache/CachedImageTest.cpp b/Source/core/loader/cache/CachedImageTest.cpp
|
| index 1468726ec467cf0cb5b74bb38461552dfbd4b3d4..b9472992d78e20d53d1e485d2162d47204368eb3 100644
|
| --- a/Source/core/loader/cache/CachedImageTest.cpp
|
| +++ b/Source/core/loader/cache/CachedImageTest.cpp
|
| @@ -31,10 +31,19 @@
|
| #include "config.h"
|
| #include "core/loader/cache/CachedImage.h"
|
|
|
| +#include "core/loader/DocumentLoader.h"
|
| +#include "core/loader/EmptyClients.h"
|
| #include "core/loader/cache/CachedImageClient.h"
|
| #include "core/loader/cache/CachedResourceHandle.h"
|
| +#include "core/loader/cache/CachedResourceLoader.h"
|
| +#include "core/loader/cache/MemoryCache.h"
|
| +#include "core/page/Frame.h"
|
| +#include "core/page/FrameView.h"
|
| +#include "core/page/Page.h"
|
| #include "core/platform/SharedBuffer.h"
|
| #include "core/platform/graphics/Image.h"
|
| +#include "public/platform/Platform.h"
|
| +#include "public/platform/WebThread.h"
|
| #include <gtest/gtest.h>
|
|
|
| using namespace WebCore;
|
| @@ -69,6 +78,20 @@ private:
|
| bool m_notifyFinishedCalled;
|
| };
|
|
|
| +class QuitTask : public WebKit::WebThread::Task {
|
| +public:
|
| + virtual void run()
|
| + {
|
| + WebKit::Platform::current()->currentThread()->exitRunLoop();
|
| + }
|
| +};
|
| +
|
| +void runPendingTasks()
|
| +{
|
| + WebKit::Platform::current()->currentThread()->postTask(new QuitTask);
|
| + WebKit::Platform::current()->currentThread()->enterRunLoop();
|
| +}
|
| +
|
| TEST(CachedImageTest, MultipartImage)
|
| {
|
| CachedResourceHandle<CachedImage> cachedImage = new CachedImage(ResourceRequest());
|
| @@ -113,4 +136,38 @@ TEST(CachedImageTest, MultipartImage)
|
| ASSERT_TRUE(client.notifyFinishedCalled());
|
| }
|
|
|
| +TEST(CachedImageTest, CancelOnDetach)
|
| +{
|
| + // Create enough of a mocked world to get a functioning ResourceLoader.
|
| + KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
|
| + Page::PageClients pageClients;
|
| + fillWithEmptyClients(pageClients);
|
| + EmptyFrameLoaderClient frameLoaderClient;
|
| + Page page(pageClients);
|
| + RefPtr<Frame> frame = Frame::create(&page, 0, &frameLoaderClient);
|
| + frame->setView(FrameView::create(frame.get()));
|
| + frame->init();
|
| + RefPtr<DocumentLoader> documentLoader = DocumentLoader::create(ResourceRequest(testURL), SubstituteData());
|
| + documentLoader->setFrame(frame.get());
|
| +
|
| + // Emulate starting a real load.
|
| + CachedResourceHandle<CachedImage> cachedImage = new CachedImage(ResourceRequest(testURL));
|
| + cachedImage->load(documentLoader->cachedResourceLoader(), ResourceLoaderOptions());
|
| + memoryCache()->add(cachedImage.get());
|
| +
|
| + MockCachedImageClient client;
|
| + cachedImage->addClient(&client);
|
| + EXPECT_EQ(CachedResource::Pending, cachedImage->status());
|
| +
|
| + // The load should still be alive, but a timer should be started to cancel the load inside removeClient().
|
| + cachedImage->removeClient(&client);
|
| + EXPECT_EQ(CachedResource::Pending, cachedImage->status());
|
| + EXPECT_NE(reinterpret_cast<CachedResource*>(0), memoryCache()->resourceForURL(testURL));
|
| +
|
| + // Trigger the cancel timer, ensure the load was cancelled and the resource was evicted from the cache.
|
| + runPendingTasks();
|
| + EXPECT_EQ(CachedResource::LoadError, cachedImage->status());
|
| + EXPECT_EQ(reinterpret_cast<CachedResource*>(0), memoryCache()->resourceForURL(testURL));
|
| +}
|
| +
|
| } // namespace
|
|
|