diff options
author | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-14 20:57:55 +0000 |
---|---|---|
committer | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-14 20:57:55 +0000 |
commit | 9f2c80205e234968f2519f60a6bc9fa6528148f7 (patch) | |
tree | 9dd9ba83425bc07558c212d8b9ff7e68d437e04d /chrome_frame/html_utils.cc | |
parent | 1e7b72d0b63349e8d3876cf46226ec3ce5feb5fa (diff) | |
download | chromium_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.cc | 36 |
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_++; } |