Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Side by Side Diff: Source/core/html/parser/HTMLTreeBuilderSimulator.cpp

Issue 110843004: Replaced HTMLIdentifier with an atomized string factory function (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Review fixes Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/html/parser/HTMLPreloadScanner.cpp ('k') | Source/wtf/text/AtomicString.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « Source/core/html/parser/HTMLPreloadScanner.cpp ('k') | Source/wtf/text/AtomicString.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698