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 7b1dc30199cfdc35d4c7c127b25bfdc122c7984f..ac3aa3b01b6905f15b526de33163f9dc9f352e9b 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"); |
} |
+const 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* imageResource, |
const KURL& url, |
const AtomicString& mimeType, |
@@ -708,6 +717,45 @@ TEST(ImageResourceTest, SVGImage) { |
EXPECT_FALSE(imageResource->getContent()->getImage()->isBitmapImage()); |
} |
+TEST(ImageResourceTest, SVGImageWithSubresource) { |
+ KURL url(ParsedURLString, "http://127.0.0.1:8000/foo"); |
+ ImageResource* imageResource = ImageResource::create(ResourceRequest(url)); |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::create(imageResource->getContent()); |
+ |
+ receiveResponse(imageResource, url, "image/svg+xml", kSvgImageWithSubresource, |
+ strlen(kSvgImageWithSubresource)); |
+ |
+ EXPECT_FALSE(imageResource->errorOccurred()); |
+ ASSERT_TRUE(imageResource->getContent()->hasImage()); |
+ EXPECT_FALSE(imageResource->getContent()->getImage()->isNull()); |
+ EXPECT_FALSE(imageResource->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(1, observer->imageChangedCount()); |
+ EXPECT_FALSE(observer->imageNotifyFinishedCalled()); |
+ EXPECT_EQ(198, imageResource->getContent()->getImage()->width()); |
+ EXPECT_EQ(100, imageResource->getContent()->getImage()->height()); |
+ |
+ // A new client added here shouldn't notified of finish. |
+ std::unique_ptr<MockImageResourceObserver> observer2 = |
+ MockImageResourceObserver::create(imageResource->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(2, observer->imageChangedCount()); |
+ EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
+ EXPECT_EQ(2, observer2->imageChangedCount()); |
+ EXPECT_TRUE(observer2->imageNotifyFinishedCalled()); |
+ EXPECT_EQ(198, imageResource->getContent()->getImage()->width()); |
+ EXPECT_EQ(100, imageResource->getContent()->getImage()->height()); |
+} |
+ |
TEST(ImageResourceTest, SuccessfulRevalidationJpeg) { |
KURL url(ParsedURLString, "http://127.0.0.1:8000/foo"); |
ImageResource* imageResource = ImageResource::create(ResourceRequest(url)); |