| Index: third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp b/third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp
|
| index 2aabde5f091cd2e9a1afeb43d6448a4a66895e6d..6b9e52289bffc771b0183d4af628eec2bb971214 100644
|
| --- a/third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp
|
| +++ b/third_party/WebKit/Source/core/svg/UnsafeSVGAttributeSanitizationTest.cpp
|
| @@ -34,7 +34,7 @@
|
| //
|
| // There are two vectors for JavaScript URLs in SVG content:
|
| //
|
| -// 1. Attributes, for example xlink:href in an <svg:a> element.
|
| +// 1. Attributes, for example xlink:href/href in an <svg:a> element.
|
| // 2. Animations which set those attributes, for example
|
| // <animate attributeName="xlink:href" values="javascript:...
|
| //
|
| @@ -79,6 +79,28 @@ TEST(
|
| OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(1, 1));
|
| static const char unsafeContent[] =
|
| "<svg xmlns='http://www.w3.org/2000/svg' "
|
| + " width='1cm' height='1cm'>"
|
| + " <a href='javascript:alert()'></a>"
|
| + "</svg>";
|
| + String sanitizedContent =
|
| + contentAfterPastingHTML(pageHolder.get(), unsafeContent);
|
| +
|
| + EXPECT_TRUE(sanitizedContent.contains("</a>")) <<
|
| + "We should have pasted *something*; the document is: " <<
|
| + sanitizedContent.utf8().data();
|
| + EXPECT_FALSE(sanitizedContent.contains(":alert()")) <<
|
| + "The JavaScript URL is unsafe and should have been stripped; "
|
| + "instead: " <<
|
| + sanitizedContent.utf8().data();
|
| +}
|
| +
|
| +TEST(
|
| + UnsafeSVGAttributeSanitizationTest,
|
| + pasteAnchor_javaScriptXlinkHrefIsStripped)
|
| +{
|
| + OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(1, 1));
|
| + static const char unsafeContent[] =
|
| + "<svg xmlns='http://www.w3.org/2000/svg' "
|
| " xmlns:xlink='http://www.w3.org/1999/xlink'"
|
| " width='1cm' height='1cm'>"
|
| " <a xlink:href='javascript:alert()'></a>"
|
| @@ -102,6 +124,28 @@ TEST(
|
| OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(1, 1));
|
| static const char unsafeContent[] =
|
| "<svg xmlns='http://www.w3.org/2000/svg' "
|
| + " width='1cm' height='1cm'>"
|
| + " <a href='jAvascriPT:alert()'></a>"
|
| + "</svg>";
|
| + String sanitizedContent =
|
| + contentAfterPastingHTML(pageHolder.get(), unsafeContent);
|
| +
|
| + EXPECT_TRUE(sanitizedContent.contains("</a>")) <<
|
| + "We should have pasted *something*; the document is: " <<
|
| + sanitizedContent.utf8().data();
|
| + EXPECT_FALSE(sanitizedContent.contains(":alert()")) <<
|
| + "The JavaScript URL is unsafe and should have been stripped; "
|
| + "instead: " <<
|
| + sanitizedContent.utf8().data();
|
| +}
|
| +
|
| +TEST(
|
| + UnsafeSVGAttributeSanitizationTest,
|
| + pasteAnchor_javaScriptXlinkHrefIsStripped_caseAndEntityInProtocol)
|
| +{
|
| + OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(1, 1));
|
| + static const char unsafeContent[] =
|
| + "<svg xmlns='http://www.w3.org/2000/svg' "
|
| " xmlns:xlink='http://www.w3.org/1999/xlink'"
|
| " width='1cm' height='1cm'>"
|
| " <a xlink:href='jAvascriPT:alert()'></a>"
|
| @@ -125,6 +169,28 @@ TEST(
|
| OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(1, 1));
|
| static const char unsafeContent[] =
|
| "<svg xmlns='http://www.w3.org/2000/svg' "
|
| + " width='1cm' height='1cm'>"
|
| + " <a href='javascript:alert()'></a>"
|
| + "</svg>";
|
| + String sanitizedContent =
|
| + contentAfterPastingHTML(pageHolder.get(), unsafeContent);
|
| +
|
| + EXPECT_TRUE(sanitizedContent.contains("</a>")) <<
|
| + "We should have pasted *something*; the document is: " <<
|
| + sanitizedContent.utf8().data();
|
| + EXPECT_FALSE(sanitizedContent.contains(":alert()")) <<
|
| + "The JavaScript URL is unsafe and should have been stripped; "
|
| + "instead: " <<
|
| + sanitizedContent.utf8().data();
|
| +}
|
| +
|
| +TEST(
|
| + UnsafeSVGAttributeSanitizationTest,
|
| + pasteAnchor_javaScriptXlinkHrefIsStripped_entityWithoutSemicolonInProtocol)
|
| +{
|
| + OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(1, 1));
|
| + static const char unsafeContent[] =
|
| + "<svg xmlns='http://www.w3.org/2000/svg' "
|
| " xmlns:xlink='http://www.w3.org/1999/xlink'"
|
| " width='1cm' height='1cm'>"
|
| " <a xlink:href='javascript:alert()'></a>"
|
| @@ -153,6 +219,30 @@ TEST(
|
| OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(1, 1));
|
| static const char unsafeContent[] =
|
| "<svg xmlns='http://www.w3.org/2000/svg' "
|
| + " width='1cm' height='1cm'>"
|
| + " <a href='https://www.google.com/'>"
|
| + " <animate attributeName='href' values='evil;JaVaSCRIpT:alert()'>"
|
| + " </a>"
|
| + "</svg>";
|
| + String sanitizedContent =
|
| + contentAfterPastingHTML(pageHolder.get(), unsafeContent);
|
| +
|
| + EXPECT_TRUE(sanitizedContent.contains("<a href=\"https://www.goo")) <<
|
| + "We should have pasted *something*; the document is: " <<
|
| + sanitizedContent.utf8().data();
|
| + EXPECT_FALSE(sanitizedContent.contains(":alert()")) <<
|
| + "The JavaScript URL is unsafe and should have been stripped; "
|
| + "instead: " <<
|
| + sanitizedContent.utf8().data();
|
| +}
|
| +
|
| +TEST(
|
| + UnsafeSVGAttributeSanitizationTest,
|
| + pasteAnimatedAnchor_javaScriptXlinkHrefIsStripped_caseAndEntityInProtocol)
|
| +{
|
| + OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(1, 1));
|
| + static const char unsafeContent[] =
|
| + "<svg xmlns='http://www.w3.org/2000/svg' "
|
| " xmlns:xlink='http://www.w3.org/1999/xlink'"
|
| " width='1cm' height='1cm'>"
|
| " <a xlink:href='https://www.google.com/'>"
|
| @@ -191,6 +281,13 @@ TEST(UnsafeSVGAttributeSanitizationTest, stringsShouldNotSupportAddition)
|
| EXPECT_EQ(AnimatedString, element->animatedPropertyType());
|
|
|
| EXPECT_FALSE(element->animatedPropertyTypeSupportsAddition());
|
| +
|
| + element->setAttributeName(SVGNames::hrefAttr);
|
| +
|
| + // Sanity check that href was identified as a "string" attribute
|
| + EXPECT_EQ(AnimatedString, element->animatedPropertyType());
|
| +
|
| + EXPECT_FALSE(element->animatedPropertyTypeSupportsAddition());
|
| }
|
|
|
| TEST(
|
| @@ -199,6 +296,7 @@ TEST(
|
| {
|
| Vector<Attribute> attributes;
|
| attributes.append(Attribute(XLinkNames::hrefAttr, "javascript:alert()"));
|
| + attributes.append(Attribute(SVGNames::hrefAttr, "javascript:alert()"));
|
| attributes.append(Attribute(SVGNames::fromAttr, "/home"));
|
| attributes.append(Attribute(SVGNames::toAttr, "javascript:own3d()"));
|
|
|
| @@ -206,18 +304,34 @@ TEST(
|
| RefPtrWillBeRawPtr<Element> element = SVGAnimateElement::create(*document);
|
| element->stripScriptingAttributes(attributes);
|
|
|
| - EXPECT_EQ(2ul, attributes.size()) <<
|
| + EXPECT_EQ(3ul, attributes.size()) <<
|
| "One of the attributes should have been stripped.";
|
| EXPECT_EQ(XLinkNames::hrefAttr, attributes[0].name()) <<
|
| "The 'xlink:href' attribute should not have been stripped from "
|
| "<animate> because it is not a URL attribute of <animate>.";
|
| - EXPECT_EQ(SVGNames::fromAttr, attributes[1].name()) <<
|
| + EXPECT_EQ(SVGNames::hrefAttr, attributes[1].name()) <<
|
| + "The 'href' attribute should not have been stripped from "
|
| + "<animate> because it is not a URL attribute of <animate>.";
|
| + EXPECT_EQ(SVGNames::fromAttr, attributes[2].name()) <<
|
| "The 'from' attribute should not have been strippef from <animate> "
|
| "because its value is innocuous.";
|
| }
|
|
|
| TEST(
|
| UnsafeSVGAttributeSanitizationTest,
|
| + isJavaScriptURLAttribute_hrefContainingJavascriptURL)
|
| +{
|
| + Attribute attribute(SVGNames::hrefAttr, "javascript:alert()");
|
| + RefPtrWillBeRawPtr<Document> document = Document::create();
|
| + RefPtrWillBeRawPtr<Element> element = SVGAElement::create(*document);
|
| + EXPECT_TRUE(
|
| + element->isJavaScriptURLAttribute(attribute)) <<
|
| + "The 'a' element should identify an 'href' attribute with a "
|
| + "JavaScript URL value as a JavaScript URL attribute";
|
| +}
|
| +
|
| +TEST(
|
| + UnsafeSVGAttributeSanitizationTest,
|
| isJavaScriptURLAttribute_xlinkHrefContainingJavascriptURL)
|
| {
|
| Attribute attribute(XLinkNames::hrefAttr, "javascript:alert()");
|
|
|