summaryrefslogtreecommitdiffstats
path: root/chrome_frame/html_utils.cc
diff options
context:
space:
mode:
authorrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-14 20:57:55 +0000
committerrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-14 20:57:55 +0000
commit9f2c80205e234968f2519f60a6bc9fa6528148f7 (patch)
tree9dd9ba83425bc07558c212d8b9ff7e68d437e04d /chrome_frame/html_utils.cc
parent1e7b72d0b63349e8d3876cf46226ec3ce5feb5fa (diff)
downloadchromium_src-9f2c80205e234968f2519f60a6bc9fa6528148f7.zip
chromium_src-9f2c80205e234968f2519f60a6bc9fa6528148f7.tar.gz
chromium_src-9f2c80205e234968f2519f60a6bc9fa6528148f7.tar.bz2
Have Chrome Frame "support" IE conditional comment tags (of the downlevel-hidden variety) by ignoring them (rather than treating them as comment start/end) when parsing HTML streams.
BUG=65627 TEST=chrome_frame_unittests.exe, also syntax like <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]--> will now activate CF. Offtopic: I wonder what happens if I paste HTML into CL comments. Heh. Review URL: http://codereview.chromium.org/5708007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@69177 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/html_utils.cc')
-rw-r--r--chrome_frame/html_utils.cc36
1 files changed, 33 insertions, 3 deletions
diff --git a/chrome_frame/html_utils.cc b/chrome_frame/html_utils.cc
index 7e41210..1d4d629 100644
--- a/chrome_frame/html_utils.cc
+++ b/chrome_frame/html_utils.cc
@@ -215,7 +215,8 @@ bool HTMLScanner::IsQuote(wchar_t c) {
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 @@ bool HTMLScanner::IsHTMLCommentClose(StringRange* html_string, StrPos pos) {
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,9 +256,28 @@ bool HTMLScanner::NextTag(StringRange* html_string, StringRange* tag) {
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_++;
}