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 |