Index: third_party/WebKit/Source/core/fetch/ResourceTest.cpp |
diff --git a/third_party/WebKit/Source/core/fetch/ResourceTest.cpp b/third_party/WebKit/Source/core/fetch/ResourceTest.cpp |
index 42dd25d715e5b200fdde4f703ca3d4942d46a512..a91cc38da54961baa506136a95622951354e2c79 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceTest.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ResourceTest.cpp |
@@ -4,6 +4,8 @@ |
#include "core/fetch/Resource.h" |
+#include "core/fetch/MemoryCache.h" |
+#include "platform/SharedBuffer.h" |
#include "platform/network/ResourceRequest.h" |
#include "platform/network/ResourceResponse.h" |
#include "platform/testing/TestingPlatformSupport.h" |
@@ -16,6 +18,22 @@ namespace blink { |
namespace { |
+class UnlockableResource : public Resource { |
+public: |
+ static RefPtrWillBeRawPtr<UnlockableResource> create(const KURL& url) |
+ { |
+ return adoptRefWillBeNoop(new UnlockableResource(ResourceRequest(url), Resource::Raw)); |
+ } |
+ |
+private: |
+ UnlockableResource(const ResourceRequest& request, Type type) |
+ : Resource(request, type) |
+ { |
+ } |
+ |
+ bool isSafeToUnlock() const override { return true; } |
+}; |
+ |
class MockPlatform final : public TestingPlatformSupport { |
public: |
MockPlatform() { } |
@@ -72,4 +90,27 @@ TEST(ResourceTest, SetCachedMetadata_DoesNotSendMetadataToPlatformWhenFetchedVia |
EXPECT_EQ(0u, mock.cachedURLs().size()); |
} |
+TEST(ResourceTest, LockFailureNoCrash) |
+{ |
+ ResourceResponse response(createTestResourceResponse()); |
+ RefPtrWillBeRawPtr<UnlockableResource> resource = UnlockableResource::create(response.url()); |
+ memoryCache()->add(resource.get()); |
+ resource->setResponse(response); |
+ |
+ // A Resource won't be put in DiscardableMemory unless it is at least 16KiB. |
+ Vector<char> dataVector(4*4096); |
+ for (int i = 0; i < 4096; i++) |
+ dataVector.append("test", 4); |
+ resource->setResourceBuffer(SharedBuffer::adoptVector(dataVector)); |
+ |
+ resource->setLoadFinishTime(currentTime()); |
+ resource->finish(); |
+ resource->prune(); |
+ ASSERT_TRUE(resource->isPurgeable()); |
+ bool didLock = resource->lock(); |
+ ASSERT_FALSE(didLock); |
+ EXPECT_EQ(nullptr, resource->resourceBuffer()); |
+ EXPECT_EQ(size_t(0), resource->encodedSize()); |
+} |
+ |
} // namespace blink |