Index: chrome_frame/html_utils.cc |
=================================================================== |
--- chrome_frame/html_utils.cc (revision 68996) |
+++ chrome_frame/html_utils.cc (working copy) |
@@ -215,7 +215,8 @@ |
return quotes_.find(c) != std::wstring::npos; |
} |
-bool HTMLScanner::IsHTMLCommentClose(StringRange* html_string, StrPos pos) { |
+bool HTMLScanner::IsHTMLCommentClose(const StringRange* html_string, |
+ StrPos pos) { |
if (pos < html_string->end_ && pos > html_string->start_ + 2 && |
*pos == L'>') { |
return *(pos-1) == L'-' && *(pos-2) == L'-'; |
@@ -223,6 +224,16 @@ |
return false; |
} |
+bool HTMLScanner::IsIEConditionalCommentClose(const StringRange* html_string, |
+ StrPos pos) { |
+ if (pos < html_string->end_ && pos > html_string->start_ + 2 && |
+ *pos == L'>') { |
+ return *(pos-1) == L']'; |
+ } |
+ return false; |
+} |
+ |
+ |
bool HTMLScanner::NextTag(StringRange* html_string, StringRange* tag) { |
DCHECK(NULL != html_string); |
DCHECK(NULL != tag); |
@@ -245,12 +256,31 @@ |
std::wstring tag_name; |
StringRange start_range(tag->start_, html_string->end_); |
start_range.GetTagName(&tag_name); |
- if (StartsWith(tag_name, L"!--", true)) { |
- // We're inside a comment tag, keep going until we get out of it. |
+ if (StartsWith(tag_name, L"!--[if", true)) { |
+ // This looks like the beginning of an IE conditional comment, scan until |
+ // we hit the end which always looks like ']>'. For now we disregard the |
+ // contents of the condition, and always assume true. |
+ // TODO(robertshield): Optionally support the grammar defined by |
+ // http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx#syntax. |
while (tag->end_ < html_string->end_ && |
+ !IsIEConditionalCommentClose(html_string, tag->end_)) { |
+ tag->end_++; |
+ } |
+ } else if (StartsWith(tag_name, L"!--", true)) { |
+ // We're inside a comment tag which ends in '-->'. Keep going until we |
+ // reach the end. |
+ while (tag->end_ < html_string->end_ && |
!IsHTMLCommentClose(html_string, tag->end_)) { |
tag->end_++; |
} |
+ } else if (StartsWith(tag_name, L"![endif", true)) { |
+ // We're inside the closing tag of an IE conditional comment which ends in |
+ // either '-->' of ']>'. Keep going until we reach the end. |
+ while (tag->end_ < html_string->end_ && |
+ !IsIEConditionalCommentClose(html_string, tag->end_) && |
+ !IsHTMLCommentClose(html_string, tag->end_)) { |
+ tag->end_++; |
+ } |
} else { |
// Properly handle quoted strings within non-comment tags by maintaining |
// some state while scanning. Specifically, we have to maintain state on |