Index: Source/core/html/HTMLViewSourceDocument.cpp |
diff --git a/Source/core/html/HTMLViewSourceDocument.cpp b/Source/core/html/HTMLViewSourceDocument.cpp |
index 389b7b9535c9781e51700fe0ea787fbe8a717703..1482f21e280f105683524541fd2d2646774f337b 100644 |
--- a/Source/core/html/HTMLViewSourceDocument.cpp |
+++ b/Source/core/html/HTMLViewSourceDocument.cpp |
@@ -47,6 +47,12 @@ namespace WebCore { |
using namespace HTMLNames; |
+namespace { |
+ |
+const char kXSSDetected[] = "Token contains a reflected XSS vector"; |
+ |
+} // namespace |
+ |
HTMLViewSourceDocument::HTMLViewSourceDocument(const DocumentInit& initializer, const String& mimeType) |
: HTMLDocument(initializer) |
, m_type(mimeType) |
@@ -86,7 +92,7 @@ void HTMLViewSourceDocument::createContainingTable() |
m_lineNumber = 0; |
} |
-void HTMLViewSourceDocument::addSource(const String& source, HTMLToken& token) |
+void HTMLViewSourceDocument::addSource(const String& source, HTMLToken& token, SourceAnnotation annotation) |
{ |
if (!m_current) |
createContainingTable(); |
@@ -103,13 +109,13 @@ void HTMLViewSourceDocument::addSource(const String& source, HTMLToken& token) |
break; |
case HTMLToken::StartTag: |
case HTMLToken::EndTag: |
- processTagToken(source, token); |
+ processTagToken(source, token, annotation); |
break; |
case HTMLToken::Comment: |
processCommentToken(source, token); |
break; |
case HTMLToken::Character: |
- processCharacterToken(source, token); |
+ processCharacterToken(source, token, annotation); |
break; |
} |
} |
@@ -128,8 +134,9 @@ void HTMLViewSourceDocument::processEndOfFileToken(const String& source, HTMLTok |
m_current = m_td; |
} |
-void HTMLViewSourceDocument::processTagToken(const String& source, HTMLToken& token) |
+void HTMLViewSourceDocument::processTagToken(const String& source, HTMLToken& token, SourceAnnotation annotation) |
{ |
+ maybeAddSpanForAnnotation(annotation); |
m_current = addSpanWithClassName("webkit-html-tag"); |
AtomicString tagName(token.name()); |
@@ -170,9 +177,9 @@ void HTMLViewSourceDocument::processCommentToken(const String& source, HTMLToken |
m_current = m_td; |
} |
-void HTMLViewSourceDocument::processCharacterToken(const String& source, HTMLToken&) |
+void HTMLViewSourceDocument::processCharacterToken(const String& source, HTMLToken&, SourceAnnotation annotation) |
{ |
- addText(source, ""); |
+ addText(source, "", annotation); |
} |
PassRefPtrWillBeRawPtr<Element> HTMLViewSourceDocument::addSpanWithClassName(const AtomicString& className) |
@@ -223,7 +230,7 @@ void HTMLViewSourceDocument::finishLine() |
m_current = m_tbody; |
} |
-void HTMLViewSourceDocument::addText(const String& text, const AtomicString& className) |
+void HTMLViewSourceDocument::addText(const String& text, const AtomicString& className, SourceAnnotation annotation) |
{ |
if (text.isEmpty()) |
return; |
@@ -242,7 +249,10 @@ void HTMLViewSourceDocument::addText(const String& text, const AtomicString& cla |
finishLine(); |
continue; |
} |
+ RefPtrWillBeRawPtr<Element> oldElement = m_current; |
+ maybeAddSpanForAnnotation(annotation); |
m_current->parserAppendChild(Text::create(*this, substring)); |
+ m_current = oldElement; |
if (i < size - 1) |
finishLine(); |
} |
@@ -294,6 +304,14 @@ PassRefPtrWillBeRawPtr<Element> HTMLViewSourceDocument::addLink(const AtomicStri |
return anchor.release(); |
} |
+void HTMLViewSourceDocument::maybeAddSpanForAnnotation(SourceAnnotation annotation) |
+{ |
+ if (annotation == AnnotateSourceAsXSS) { |
+ m_current = addSpanWithClassName("webkit-highlight"); |
+ m_current->setAttribute(titleAttr, kXSSDetected); |
+ } |
+} |
+ |
void HTMLViewSourceDocument::trace(Visitor* visitor) |
{ |
visitor->trace(m_current); |