Index: third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
index 065b2d2ddcf80928dfa8c7e92efa8c124da9b00e..824365b7e217d2a1ee4ef69b2a2d286c96fa1129 100644 |
--- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
@@ -161,6 +161,15 @@ String GetTestFilePath() { |
return testing::WebTestDataPath("cancelTest.html"); |
} |
+constexpr char kSvgImageWithSubresource[] = |
+ "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"198\" height=\"100\">" |
+ "<style>" |
+ " <![CDATA[@font-face{font-family:\"test\"; " |
+ " src:url('data:font/ttf;base64,invalidFontData');}]]>" |
+ "</style>" |
+ "<text x=\"50\" y=\"50\" font-family=\"test\" font-size=\"16\">Fox</text>" |
+ "</svg>"; |
+ |
void ReceiveResponse(ImageResource* image_resource, |
const KURL& url, |
const AtomicString& mime_type, |
@@ -773,6 +782,51 @@ TEST(ImageResourceTest, SVGImage) { |
EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
} |
+TEST(ImageResourceTest, SVGImageWithSubresource) { |
+ KURL url(kParsedURLString, "http://127.0.0.1:8000/foo"); |
+ ImageResource* image_resource = ImageResource::Create(ResourceRequest(url)); |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::Create(image_resource->GetContent()); |
+ |
+ ReceiveResponse(image_resource, url, "image/svg+xml", |
+ kSvgImageWithSubresource, strlen(kSvgImageWithSubresource)); |
+ |
+ EXPECT_FALSE(image_resource->ErrorOccurred()); |
+ ASSERT_TRUE(image_resource->GetContent()->HasImage()); |
+ EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); |
+ EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+ |
+ // At this point, image is (mostly) available but the loading is not yet |
+ // finished because of SVG's subresources, and thus ImageChanged() or |
+ // ImageNotifyFinished() are not called. |
+ EXPECT_EQ(ResourceStatus::kPending, |
+ image_resource->GetContent()->GetContentStatus()); |
+ EXPECT_EQ(1, observer->ImageChangedCount()); |
+ EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); |
+ EXPECT_EQ(198, image_resource->GetContent()->GetImage()->width()); |
+ EXPECT_EQ(100, image_resource->GetContent()->GetImage()->height()); |
+ |
+ // A new client added here shouldn't notified of finish. |
+ std::unique_ptr<MockImageResourceObserver> observer2 = |
+ MockImageResourceObserver::Create(image_resource->GetContent()); |
+ EXPECT_EQ(1, observer2->ImageChangedCount()); |
+ EXPECT_FALSE(observer2->ImageNotifyFinishedCalled()); |
+ |
+ // After asynchronous tasks are executed, the loading of SVG document is |
+ // completed and ImageNotifyFinished() is called. |
+ testing::RunPendingTasks(); |
+ EXPECT_EQ(ResourceStatus::kCached, |
+ image_resource->GetContent()->GetContentStatus()); |
+ EXPECT_EQ(2, observer->ImageChangedCount()); |
+ EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
+ EXPECT_EQ(2, observer2->ImageChangedCount()); |
+ EXPECT_TRUE(observer2->ImageNotifyFinishedCalled()); |
+ EXPECT_EQ(198, image_resource->GetContent()->GetImage()->width()); |
+ EXPECT_EQ(100, image_resource->GetContent()->GetImage()->height()); |
+ |
+ GetMemoryCache()->EvictResources(); |
+} |
+ |
TEST(ImageResourceTest, SuccessfulRevalidationJpeg) { |
KURL url(kParsedURLString, "http://127.0.0.1:8000/foo"); |
ImageResource* image_resource = ImageResource::Create(ResourceRequest(url)); |