bool HTMLTreeBuilderSimulator::simulate(const CompactHTMLToken& token, HTMLTokenizer* tokenizer) { if (token.type() == HTMLToken::StartTag) { const HTMLIdentifier& tagName = token.data(); if (threadSafeMatch(tagName, SVGNames::svgTag)) m_namespaceStack.append(SVG); if (threadSafeMatch(tagName, MathMLNames::mathTag)) m_namespaceStack.append(MathML); if (inForeignContent() && tokenExitsForeignContent(token)) m_namespaceStack.removeLast(); if ((m_namespaceStack.last() == SVG && tokenExitsSVG(token)) || (m_namespaceStack.last() == MathML && tokenExitsMath(token))) m_namespaceStack.append(HTML); if (!inForeignContent()) { // FIXME: This is just a copy of Tokenizer::updateStateFor which uses threadSafeMatches. if (threadSafeHTMLNamesMatch(tagName, textareaTag) || threadSafeHTMLNamesMatch(tagName, titleTag)) tokenizer->setState(HTMLTokenizer::RCDATAState); else if (threadSafeHTMLNamesMatch(tagName, plaintextTag)) tokenizer->setState(HTMLTokenizer::PLAINTEXTState); else if (threadSafeHTMLNamesMatch(tagName, scriptTag)) tokenizer->setState(HTMLTokenizer::ScriptDataState); else if (threadSafeHTMLNamesMatch(tagName, styleTag) || threadSafeHTMLNamesMatch(tagName, iframeTag) || threadSafeHTMLNamesMatch(tagName, xmpTag) || (threadSafeHTMLNamesMatch(tagName, noembedTag) && m_options.pluginsEnabled) || threadSafeHTMLNamesMatch(tagName, noframesTag) || (threadSafeHTMLNamesMatch(tagName, noscriptTag) && m_options.scriptEnabled)) tokenizer->setState(HTMLTokenizer::RAWTEXTState); } } if (token.type() == HTMLToken::EndTag) { const HTMLIdentifier& tagName = token.data(); if ((m_namespaceStack.last() == SVG && threadSafeMatch(tagName, SVGNames::svgTag)) || (m_namespaceStack.last() == MathML && threadSafeMatch(tagName, MathMLNames::mathTag)) || (m_namespaceStack.contains(SVG) && m_namespaceStack.last() == HTML && tokenExitsSVG(token)) || (m_namespaceStack.contains(MathML) && m_namespaceStack.last() == HTML && tokenExitsMath(token))) m_namespaceStack.removeLast(); if (threadSafeHTMLNamesMatch(tagName, scriptTag)) { if (!inForeignContent()) tokenizer->setState(HTMLTokenizer::DataState); return false; } } // FIXME: Also setForceNullCharacterReplacement when in text mode. tokenizer->setForceNullCharacterReplacement(inForeignContent()); tokenizer->setShouldAllowCDATA(inForeignContent()); return true; }
static bool tokenExitsMath(const CompactHTMLToken& token) { // FIXME: This is copied from HTMLElementStack::isMathMLTextIntegrationPoint and changed to use threadSafeMatch. const HTMLIdentifier& tagName = token.data(); return threadSafeMatch(tagName, MathMLNames::miTag) || threadSafeMatch(tagName, MathMLNames::moTag) || threadSafeMatch(tagName, MathMLNames::mnTag) || threadSafeMatch(tagName, MathMLNames::msTag) || threadSafeMatch(tagName, MathMLNames::mtextTag); }
static bool tokenExitsForeignContent(const CompactHTMLToken& token) { // FIXME: This is copied from HTMLTreeBuilder::processTokenInForeignContent and changed to use threadSafeHTMLNamesMatch. const HTMLIdentifier& tagName = token.data(); return threadSafeHTMLNamesMatch(tagName, bTag) || threadSafeHTMLNamesMatch(tagName, bigTag) || threadSafeHTMLNamesMatch(tagName, blockquoteTag) || threadSafeHTMLNamesMatch(tagName, bodyTag) || threadSafeHTMLNamesMatch(tagName, brTag) || threadSafeHTMLNamesMatch(tagName, centerTag) || threadSafeHTMLNamesMatch(tagName, codeTag) || threadSafeHTMLNamesMatch(tagName, ddTag) || threadSafeHTMLNamesMatch(tagName, divTag) || threadSafeHTMLNamesMatch(tagName, dlTag) || threadSafeHTMLNamesMatch(tagName, dtTag) || threadSafeHTMLNamesMatch(tagName, emTag) || threadSafeHTMLNamesMatch(tagName, embedTag) || threadSafeHTMLNamesMatch(tagName, h1Tag) || threadSafeHTMLNamesMatch(tagName, h2Tag) || threadSafeHTMLNamesMatch(tagName, h3Tag) || threadSafeHTMLNamesMatch(tagName, h4Tag) || threadSafeHTMLNamesMatch(tagName, h5Tag) || threadSafeHTMLNamesMatch(tagName, h6Tag) || threadSafeHTMLNamesMatch(tagName, headTag) || threadSafeHTMLNamesMatch(tagName, hrTag) || threadSafeHTMLNamesMatch(tagName, iTag) || threadSafeHTMLNamesMatch(tagName, imgTag) || threadSafeHTMLNamesMatch(tagName, liTag) || threadSafeHTMLNamesMatch(tagName, listingTag) || threadSafeHTMLNamesMatch(tagName, menuTag) || threadSafeHTMLNamesMatch(tagName, metaTag) || threadSafeHTMLNamesMatch(tagName, nobrTag) || threadSafeHTMLNamesMatch(tagName, olTag) || threadSafeHTMLNamesMatch(tagName, pTag) || threadSafeHTMLNamesMatch(tagName, preTag) || threadSafeHTMLNamesMatch(tagName, rubyTag) || threadSafeHTMLNamesMatch(tagName, sTag) || threadSafeHTMLNamesMatch(tagName, smallTag) || threadSafeHTMLNamesMatch(tagName, spanTag) || threadSafeHTMLNamesMatch(tagName, strongTag) || threadSafeHTMLNamesMatch(tagName, strikeTag) || threadSafeHTMLNamesMatch(tagName, subTag) || threadSafeHTMLNamesMatch(tagName, supTag) || threadSafeHTMLNamesMatch(tagName, tableTag) || threadSafeHTMLNamesMatch(tagName, ttTag) || threadSafeHTMLNamesMatch(tagName, uTag) || threadSafeHTMLNamesMatch(tagName, ulTag) || threadSafeHTMLNamesMatch(tagName, varTag) || (threadSafeHTMLNamesMatch(tagName, fontTag) && (token.getAttributeItem(colorAttr) || token.getAttributeItem(faceAttr) || token.getAttributeItem(sizeAttr))); }
bool BackgroundHTMLParser::simulateTreeBuilder(const CompactHTMLToken& token) { if (token.type() == HTMLTokenTypes::StartTag) { const String& tagName = token.data(); if (threadSafeMatch(tagName, SVGNames::svgTag) || threadSafeMatch(tagName, MathMLNames::mathTag)) m_inForeignContent = true; // FIXME: This is just a copy of Tokenizer::updateStateFor which uses threadSafeMatches. if (threadSafeMatch(tagName, textareaTag) || threadSafeMatch(tagName, titleTag)) m_tokenizer->setState(HTMLTokenizerState::RCDATAState); else if (threadSafeMatch(tagName, plaintextTag)) m_tokenizer->setState(HTMLTokenizerState::PLAINTEXTState); else if (threadSafeMatch(tagName, scriptTag)) m_tokenizer->setState(HTMLTokenizerState::ScriptDataState); else if (threadSafeMatch(tagName, styleTag) || threadSafeMatch(tagName, iframeTag) || threadSafeMatch(tagName, xmpTag) || (threadSafeMatch(tagName, noembedTag) && m_options.pluginsEnabled) || threadSafeMatch(tagName, noframesTag) || (threadSafeMatch(tagName, noscriptTag) && m_options.scriptEnabled)) m_tokenizer->setState(HTMLTokenizerState::RAWTEXTState); } if (token.type() == HTMLTokenTypes::EndTag) { const String& tagName = token.data(); if (threadSafeMatch(tagName, SVGNames::svgTag) || threadSafeMatch(tagName, MathMLNames::mathTag)) m_inForeignContent = false; if (threadSafeMatch(tagName, scriptTag)) return false; } // FIXME: Need to set setForceNullCharacterReplacement based on m_inForeignContent as well. m_tokenizer->setShouldAllowCDATA(m_inForeignContent); return true; }
static bool tokenExitsSVG(const CompactHTMLToken& token) { // FIXME: It's very fragile that we special case foreignObject here to be case-insensitive. return equalIgnoringCaseNonNull(token.data().asStringImpl(), SVGNames::foreignObjectTag.localName().impl()); }
static bool tokenExitsSVG(const CompactHTMLToken& token) { const String& tagName = token.data(); return equalIgnoringCase(tagName, SVGNames::foreignObjectTag.localName()); }