| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2013 Google, Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #include "core/html/parser/HTMLTokenizer.h" | 33 #include "core/html/parser/HTMLTokenizer.h" |
| 34 #include "core/html/parser/HTMLTreeBuilder.h" | 34 #include "core/html/parser/HTMLTreeBuilder.h" |
| 35 | 35 |
| 36 namespace WebCore { | 36 namespace WebCore { |
| 37 | 37 |
| 38 using namespace HTMLNames; | 38 using namespace HTMLNames; |
| 39 | 39 |
| 40 static bool tokenExitsForeignContent(const CompactHTMLToken& token) | 40 static bool tokenExitsForeignContent(const CompactHTMLToken& token) |
| 41 { | 41 { |
| 42 // FIXME: This is copied from HTMLTreeBuilder::processTokenInForeignContent
and changed to use threadSafeHTMLNamesMatch. | 42 // FIXME: This is copied from HTMLTreeBuilder::processTokenInForeignContent
and changed to use threadSafeHTMLNamesMatch. |
| 43 const HTMLIdentifier& tagName = token.data(); | 43 const String& tagName = token.data(); |
| 44 return threadSafeHTMLNamesMatch(tagName, bTag) | 44 return threadSafeMatch(tagName, bTag) |
| 45 || threadSafeHTMLNamesMatch(tagName, bigTag) | 45 || threadSafeMatch(tagName, bigTag) |
| 46 || threadSafeHTMLNamesMatch(tagName, blockquoteTag) | 46 || threadSafeMatch(tagName, blockquoteTag) |
| 47 || threadSafeHTMLNamesMatch(tagName, bodyTag) | 47 || threadSafeMatch(tagName, bodyTag) |
| 48 || threadSafeHTMLNamesMatch(tagName, brTag) | 48 || threadSafeMatch(tagName, brTag) |
| 49 || threadSafeHTMLNamesMatch(tagName, centerTag) | 49 || threadSafeMatch(tagName, centerTag) |
| 50 || threadSafeHTMLNamesMatch(tagName, codeTag) | 50 || threadSafeMatch(tagName, codeTag) |
| 51 || threadSafeHTMLNamesMatch(tagName, ddTag) | 51 || threadSafeMatch(tagName, ddTag) |
| 52 || threadSafeHTMLNamesMatch(tagName, divTag) | 52 || threadSafeMatch(tagName, divTag) |
| 53 || threadSafeHTMLNamesMatch(tagName, dlTag) | 53 || threadSafeMatch(tagName, dlTag) |
| 54 || threadSafeHTMLNamesMatch(tagName, dtTag) | 54 || threadSafeMatch(tagName, dtTag) |
| 55 || threadSafeHTMLNamesMatch(tagName, emTag) | 55 || threadSafeMatch(tagName, emTag) |
| 56 || threadSafeHTMLNamesMatch(tagName, embedTag) | 56 || threadSafeMatch(tagName, embedTag) |
| 57 || threadSafeHTMLNamesMatch(tagName, h1Tag) | 57 || threadSafeMatch(tagName, h1Tag) |
| 58 || threadSafeHTMLNamesMatch(tagName, h2Tag) | 58 || threadSafeMatch(tagName, h2Tag) |
| 59 || threadSafeHTMLNamesMatch(tagName, h3Tag) | 59 || threadSafeMatch(tagName, h3Tag) |
| 60 || threadSafeHTMLNamesMatch(tagName, h4Tag) | 60 || threadSafeMatch(tagName, h4Tag) |
| 61 || threadSafeHTMLNamesMatch(tagName, h5Tag) | 61 || threadSafeMatch(tagName, h5Tag) |
| 62 || threadSafeHTMLNamesMatch(tagName, h6Tag) | 62 || threadSafeMatch(tagName, h6Tag) |
| 63 || threadSafeHTMLNamesMatch(tagName, headTag) | 63 || threadSafeMatch(tagName, headTag) |
| 64 || threadSafeHTMLNamesMatch(tagName, hrTag) | 64 || threadSafeMatch(tagName, hrTag) |
| 65 || threadSafeHTMLNamesMatch(tagName, iTag) | 65 || threadSafeMatch(tagName, iTag) |
| 66 || threadSafeHTMLNamesMatch(tagName, imgTag) | 66 || threadSafeMatch(tagName, imgTag) |
| 67 || threadSafeHTMLNamesMatch(tagName, liTag) | 67 || threadSafeMatch(tagName, liTag) |
| 68 || threadSafeHTMLNamesMatch(tagName, listingTag) | 68 || threadSafeMatch(tagName, listingTag) |
| 69 || threadSafeHTMLNamesMatch(tagName, menuTag) | 69 || threadSafeMatch(tagName, menuTag) |
| 70 || threadSafeHTMLNamesMatch(tagName, metaTag) | 70 || threadSafeMatch(tagName, metaTag) |
| 71 || threadSafeHTMLNamesMatch(tagName, nobrTag) | 71 || threadSafeMatch(tagName, nobrTag) |
| 72 || threadSafeHTMLNamesMatch(tagName, olTag) | 72 || threadSafeMatch(tagName, olTag) |
| 73 || threadSafeHTMLNamesMatch(tagName, pTag) | 73 || threadSafeMatch(tagName, pTag) |
| 74 || threadSafeHTMLNamesMatch(tagName, preTag) | 74 || threadSafeMatch(tagName, preTag) |
| 75 || threadSafeHTMLNamesMatch(tagName, rubyTag) | 75 || threadSafeMatch(tagName, rubyTag) |
| 76 || threadSafeHTMLNamesMatch(tagName, sTag) | 76 || threadSafeMatch(tagName, sTag) |
| 77 || threadSafeHTMLNamesMatch(tagName, smallTag) | 77 || threadSafeMatch(tagName, smallTag) |
| 78 || threadSafeHTMLNamesMatch(tagName, spanTag) | 78 || threadSafeMatch(tagName, spanTag) |
| 79 || threadSafeHTMLNamesMatch(tagName, strongTag) | 79 || threadSafeMatch(tagName, strongTag) |
| 80 || threadSafeHTMLNamesMatch(tagName, strikeTag) | 80 || threadSafeMatch(tagName, strikeTag) |
| 81 || threadSafeHTMLNamesMatch(tagName, subTag) | 81 || threadSafeMatch(tagName, subTag) |
| 82 || threadSafeHTMLNamesMatch(tagName, supTag) | 82 || threadSafeMatch(tagName, supTag) |
| 83 || threadSafeHTMLNamesMatch(tagName, tableTag) | 83 || threadSafeMatch(tagName, tableTag) |
| 84 || threadSafeHTMLNamesMatch(tagName, ttTag) | 84 || threadSafeMatch(tagName, ttTag) |
| 85 || threadSafeHTMLNamesMatch(tagName, uTag) | 85 || threadSafeMatch(tagName, uTag) |
| 86 || threadSafeHTMLNamesMatch(tagName, ulTag) | 86 || threadSafeMatch(tagName, ulTag) |
| 87 || threadSafeHTMLNamesMatch(tagName, varTag) | 87 || threadSafeMatch(tagName, varTag) |
| 88 || (threadSafeHTMLNamesMatch(tagName, fontTag) && (token.getAttributeIte
m(colorAttr) || token.getAttributeItem(faceAttr) || token.getAttributeItem(sizeA
ttr))); | 88 || (threadSafeMatch(tagName, fontTag) && (token.getAttributeItem(colorAt
tr) || token.getAttributeItem(faceAttr) || token.getAttributeItem(sizeAttr))); |
| 89 } | 89 } |
| 90 | 90 |
| 91 static bool tokenExitsSVG(const CompactHTMLToken& token) | 91 static bool tokenExitsSVG(const CompactHTMLToken& token) |
| 92 { | 92 { |
| 93 // FIXME: It's very fragile that we special case foreignObject here to be ca
se-insensitive. | 93 // FIXME: It's very fragile that we special case foreignObject here to be ca
se-insensitive. |
| 94 return equalIgnoringCaseNonNull(token.data().asStringImpl(), SVGNames::forei
gnObjectTag.localName().impl()); | 94 return equalIgnoringCaseNonNull(token.data().impl(), SVGNames::foreignObject
Tag.localName().impl()); |
| 95 } | 95 } |
| 96 | 96 |
| 97 static bool tokenExitsMath(const CompactHTMLToken& token) | 97 static bool tokenExitsMath(const CompactHTMLToken& token) |
| 98 { | 98 { |
| 99 // FIXME: This is copied from HTMLElementStack::isMathMLTextIntegrationPoint
and changed to use threadSafeMatch. | 99 // FIXME: This is copied from HTMLElementStack::isMathMLTextIntegrationPoint
and changed to use threadSafeMatch. |
| 100 const HTMLIdentifier& tagName = token.data(); | 100 const String& tagName = token.data(); |
| 101 return threadSafeMatch(tagName, MathMLNames::miTag) | 101 return threadSafeMatch(tagName, MathMLNames::miTag) |
| 102 || threadSafeMatch(tagName, MathMLNames::moTag) | 102 || threadSafeMatch(tagName, MathMLNames::moTag) |
| 103 || threadSafeMatch(tagName, MathMLNames::mnTag) | 103 || threadSafeMatch(tagName, MathMLNames::mnTag) |
| 104 || threadSafeMatch(tagName, MathMLNames::msTag) | 104 || threadSafeMatch(tagName, MathMLNames::msTag) |
| 105 || threadSafeMatch(tagName, MathMLNames::mtextTag); | 105 || threadSafeMatch(tagName, MathMLNames::mtextTag); |
| 106 } | 106 } |
| 107 | 107 |
| 108 HTMLTreeBuilderSimulator::HTMLTreeBuilderSimulator(const HTMLParserOptions& opti
ons) | 108 HTMLTreeBuilderSimulator::HTMLTreeBuilderSimulator(const HTMLParserOptions& opti
ons) |
| 109 : m_options(options) | 109 : m_options(options) |
| 110 { | 110 { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 125 if (namespaceStack.isEmpty() || namespaceStack.last() != currentNamespac
e) | 125 if (namespaceStack.isEmpty() || namespaceStack.last() != currentNamespac
e) |
| 126 namespaceStack.append(currentNamespace); | 126 namespaceStack.append(currentNamespace); |
| 127 } | 127 } |
| 128 namespaceStack.reverse(); | 128 namespaceStack.reverse(); |
| 129 return namespaceStack; | 129 return namespaceStack; |
| 130 } | 130 } |
| 131 | 131 |
| 132 bool HTMLTreeBuilderSimulator::simulate(const CompactHTMLToken& token, HTMLToken
izer* tokenizer) | 132 bool HTMLTreeBuilderSimulator::simulate(const CompactHTMLToken& token, HTMLToken
izer* tokenizer) |
| 133 { | 133 { |
| 134 if (token.type() == HTMLToken::StartTag) { | 134 if (token.type() == HTMLToken::StartTag) { |
| 135 const HTMLIdentifier& tagName = token.data(); | 135 const String& tagName = token.data(); |
| 136 if (threadSafeMatch(tagName, SVGNames::svgTag)) | 136 if (threadSafeMatch(tagName, SVGNames::svgTag)) |
| 137 m_namespaceStack.append(SVG); | 137 m_namespaceStack.append(SVG); |
| 138 if (threadSafeMatch(tagName, MathMLNames::mathTag)) | 138 if (threadSafeMatch(tagName, MathMLNames::mathTag)) |
| 139 m_namespaceStack.append(MathML); | 139 m_namespaceStack.append(MathML); |
| 140 if (inForeignContent() && tokenExitsForeignContent(token)) | 140 if (inForeignContent() && tokenExitsForeignContent(token)) |
| 141 m_namespaceStack.removeLast(); | 141 m_namespaceStack.removeLast(); |
| 142 if ((m_namespaceStack.last() == SVG && tokenExitsSVG(token)) | 142 if ((m_namespaceStack.last() == SVG && tokenExitsSVG(token)) |
| 143 || (m_namespaceStack.last() == MathML && tokenExitsMath(token))) | 143 || (m_namespaceStack.last() == MathML && tokenExitsMath(token))) |
| 144 m_namespaceStack.append(HTML); | 144 m_namespaceStack.append(HTML); |
| 145 if (!inForeignContent()) { | 145 if (!inForeignContent()) { |
| 146 // FIXME: This is just a copy of Tokenizer::updateStateFor which use
s threadSafeMatches. | 146 // FIXME: This is just a copy of Tokenizer::updateStateFor which use
s threadSafeMatches. |
| 147 if (threadSafeHTMLNamesMatch(tagName, textareaTag) || threadSafeHTML
NamesMatch(tagName, titleTag)) | 147 if (threadSafeMatch(tagName, textareaTag) || threadSafeMatch(tagName
, titleTag)) |
| 148 tokenizer->setState(HTMLTokenizer::RCDATAState); | 148 tokenizer->setState(HTMLTokenizer::RCDATAState); |
| 149 else if (threadSafeHTMLNamesMatch(tagName, plaintextTag)) | 149 else if (threadSafeMatch(tagName, plaintextTag)) |
| 150 tokenizer->setState(HTMLTokenizer::PLAINTEXTState); | 150 tokenizer->setState(HTMLTokenizer::PLAINTEXTState); |
| 151 else if (threadSafeHTMLNamesMatch(tagName, scriptTag)) | 151 else if (threadSafeMatch(tagName, scriptTag)) |
| 152 tokenizer->setState(HTMLTokenizer::ScriptDataState); | 152 tokenizer->setState(HTMLTokenizer::ScriptDataState); |
| 153 else if (threadSafeHTMLNamesMatch(tagName, styleTag) | 153 else if (threadSafeMatch(tagName, styleTag) |
| 154 || threadSafeHTMLNamesMatch(tagName, iframeTag) | 154 || threadSafeMatch(tagName, iframeTag) |
| 155 || threadSafeHTMLNamesMatch(tagName, xmpTag) | 155 || threadSafeMatch(tagName, xmpTag) |
| 156 || (threadSafeHTMLNamesMatch(tagName, noembedTag) && m_options.p
luginsEnabled) | 156 || (threadSafeMatch(tagName, noembedTag) && m_options.pluginsEna
bled) |
| 157 || threadSafeHTMLNamesMatch(tagName, noframesTag) | 157 || threadSafeMatch(tagName, noframesTag) |
| 158 || (threadSafeHTMLNamesMatch(tagName, noscriptTag) && m_options.
scriptEnabled)) | 158 || (threadSafeMatch(tagName, noscriptTag) && m_options.scriptEna
bled)) |
| 159 tokenizer->setState(HTMLTokenizer::RAWTEXTState); | 159 tokenizer->setState(HTMLTokenizer::RAWTEXTState); |
| 160 } | 160 } |
| 161 } | 161 } |
| 162 | 162 |
| 163 if (token.type() == HTMLToken::EndTag) { | 163 if (token.type() == HTMLToken::EndTag) { |
| 164 const HTMLIdentifier& tagName = token.data(); | 164 const String& tagName = token.data(); |
| 165 if ((m_namespaceStack.last() == SVG && threadSafeMatch(tagName, SVGNames
::svgTag)) | 165 if ((m_namespaceStack.last() == SVG && threadSafeMatch(tagName, SVGNames
::svgTag)) |
| 166 || (m_namespaceStack.last() == MathML && threadSafeMatch(tagName, Ma
thMLNames::mathTag)) | 166 || (m_namespaceStack.last() == MathML && threadSafeMatch(tagName, Ma
thMLNames::mathTag)) |
| 167 || (m_namespaceStack.contains(SVG) && m_namespaceStack.last() == HTM
L && tokenExitsSVG(token)) | 167 || (m_namespaceStack.contains(SVG) && m_namespaceStack.last() == HTM
L && tokenExitsSVG(token)) |
| 168 || (m_namespaceStack.contains(MathML) && m_namespaceStack.last() ==
HTML && tokenExitsMath(token))) | 168 || (m_namespaceStack.contains(MathML) && m_namespaceStack.last() ==
HTML && tokenExitsMath(token))) |
| 169 m_namespaceStack.removeLast(); | 169 m_namespaceStack.removeLast(); |
| 170 if (threadSafeHTMLNamesMatch(tagName, scriptTag)) { | 170 if (threadSafeMatch(tagName, scriptTag)) { |
| 171 if (!inForeignContent()) | 171 if (!inForeignContent()) |
| 172 tokenizer->setState(HTMLTokenizer::DataState); | 172 tokenizer->setState(HTMLTokenizer::DataState); |
| 173 return false; | 173 return false; |
| 174 } | 174 } |
| 175 } | 175 } |
| 176 | 176 |
| 177 // FIXME: Also setForceNullCharacterReplacement when in text mode. | 177 // FIXME: Also setForceNullCharacterReplacement when in text mode. |
| 178 tokenizer->setForceNullCharacterReplacement(inForeignContent()); | 178 tokenizer->setForceNullCharacterReplacement(inForeignContent()); |
| 179 tokenizer->setShouldAllowCDATA(inForeignContent()); | 179 tokenizer->setShouldAllowCDATA(inForeignContent()); |
| 180 return true; | 180 return true; |
| 181 } | 181 } |
| 182 | 182 |
| 183 } | 183 } |
| OLD | NEW |