summaryrefslogtreecommitdiffstats
path: root/WebCore/html/HTMLTreeBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/html/HTMLTreeBuilder.cpp')
-rw-r--r--WebCore/html/HTMLTreeBuilder.cpp119
1 files changed, 57 insertions, 62 deletions
diff --git a/WebCore/html/HTMLTreeBuilder.cpp b/WebCore/html/HTMLTreeBuilder.cpp
index 93da3f7..ec15f9f 100644
--- a/WebCore/html/HTMLTreeBuilder.cpp
+++ b/WebCore/html/HTMLTreeBuilder.cpp
@@ -119,7 +119,7 @@ bool isSpecialTag(const AtomicString& tagName)
|| tagName == asideTag
|| tagName == baseTag
|| tagName == basefontTag
- || tagName == "bgsound"
+ || tagName == bgsoundTag
|| tagName == blockquoteTag
|| tagName == bodyTag
|| tagName == brTag
@@ -127,16 +127,16 @@ bool isSpecialTag(const AtomicString& tagName)
|| tagName == centerTag
|| tagName == colTag
|| tagName == colgroupTag
- || tagName == "command"
+ || tagName == commandTag
|| tagName == ddTag
- || tagName == "details"
+ || tagName == detailsTag
|| tagName == dirTag
|| tagName == divTag
|| tagName == dlTag
|| tagName == dtTag
|| tagName == embedTag
|| tagName == fieldsetTag
- || tagName == "figure"
+ || tagName == figureTag
|| tagName == footerTag
|| tagName == formTag
|| tagName == frameTag
@@ -183,7 +183,6 @@ bool isSpecialTag(const AtomicString& tagName)
bool isScopingTag(const AtomicString& tagName)
{
return tagName == appletTag
- || tagName == buttonTag
|| tagName == captionTag
|| tagName == SVGNames::foreignObjectTag
|| tagName == htmlTag
@@ -393,27 +392,6 @@ static void convertToOldStyle(AtomicHTMLToken& token, Token& oldStyleToken)
}
}
-void HTMLTreeBuilder::handleScriptStartTag()
-{
- notImplemented(); // The HTML frgment case?
- m_tokenizer->setState(HTMLTokenizer::ScriptDataState);
- notImplemented(); // Save insertion mode.
-}
-
-void HTMLTreeBuilder::handleScriptEndTag(Element* scriptElement, int scriptStartLine)
-{
- ASSERT(!m_scriptToProcess); // Caller never called takeScriptToProcess!
- ASSERT(m_scriptToProcessStartLine == uninitializedLineNumberValue); // Caller never called takeScriptToProcess!
- notImplemented(); // Save insertion mode and insertion point?
-
- // Pause ourselves so that parsing stops until the script can be processed by the caller.
- m_isPaused = true;
- m_scriptToProcess = scriptElement;
- // Lexer line numbers are 0-based, ScriptSourceCode expects 1-based lines,
- // so we convert here before passing the line number off to HTMLScriptRunner.
- m_scriptToProcessStartLine = scriptStartLine + 1;
-}
-
PassRefPtr<Element> HTMLTreeBuilder::takeScriptToProcess(int& scriptStartLine)
{
// Unpause ourselves, callers may pause us again when processing the script.
@@ -471,7 +449,7 @@ void HTMLTreeBuilder::passTokenToLegacyParser(HTMLToken& token)
// This work is supposed to be done by the parser, but
// when using the old parser for we have to do this manually.
if (oldStyleToken.tagName == scriptTag) {
- handleScriptStartTag();
+ m_tokenizer->setState(HTMLTokenizer::ScriptDataState);
m_lastScriptElement = static_pointer_cast<Element>(result);
m_lastScriptElementStartLine = m_tokenizer->lineNumber();
} else if (oldStyleToken.tagName == preTag || oldStyleToken.tagName == listingTag)
@@ -488,8 +466,16 @@ void HTMLTreeBuilder::passTokenToLegacyParser(HTMLToken& token)
// a DocumentFragment for pasting so that javascript content
// does not show up in pasted HTML.
m_lastScriptElement->removeChildren();
- } else if (insertionMode() != AfterFramesetMode)
- handleScriptEndTag(m_lastScriptElement.get(), m_lastScriptElementStartLine);
+ } else if (insertionMode() != AfterFramesetMode) {
+ ASSERT(!m_scriptToProcess); // Caller never called takeScriptToProcess!
+ ASSERT(m_scriptToProcessStartLine == uninitializedLineNumberValue); // Caller never called takeScriptToProcess!
+ // Pause ourselves so that parsing stops until the script can be processed by the caller.
+ m_isPaused = true;
+ m_scriptToProcess = m_lastScriptElement.get();
+ // Lexer line numbers are 0-based, ScriptSourceCode expects 1-based lines,
+ // so we convert here before passing the line number off to HTMLScriptRunner.
+ m_scriptToProcessStartLine = m_lastScriptElementStartLine + 1;
+ }
m_lastScriptElement = 0;
m_lastScriptElementStartLine = uninitializedLineNumberValue;
}
@@ -572,9 +558,9 @@ void HTMLTreeBuilder::processFakeCharacters(const String& characters)
processCharacterBuffer(buffer);
}
-void HTMLTreeBuilder::processFakePEndTagIfPInScope()
+void HTMLTreeBuilder::processFakePEndTagIfPInButtonScope()
{
- if (!m_tree.openElements()->inScope(pTag.localName()))
+ if (!m_tree.openElements()->inButtonScope(pTag.localName()))
return;
AtomicHTMLToken endP(HTMLToken::EndTag, pTag.localName());
processEndTag(endP);
@@ -654,7 +640,7 @@ void HTMLTreeBuilder::processCloseWhenNestedTag(AtomicHTMLToken& token)
break;
nodeRecord = nodeRecord->next();
}
- processFakePEndTagIfPInScope();
+ processFakePEndTagIfPInButtonScope();
m_tree.insertHTMLElement(token);
}
@@ -694,14 +680,15 @@ void adjustSVGTagNameCase(AtomicHTMLToken& token)
token.setName(casedName.localName());
}
-void adjustSVGAttributes(AtomicHTMLToken& token)
+template<QualifiedName** getAttrs(size_t* length)>
+void adjustAttributes(AtomicHTMLToken& token)
{
static PrefixedNameToQualifiedNameMap* caseMap = 0;
if (!caseMap) {
caseMap = new PrefixedNameToQualifiedNameMap;
size_t length = 0;
- QualifiedName** svgAttrs = SVGNames::getSVGAttrs(&length);
- mapLoweredLocalNameToName(caseMap, svgAttrs, length);
+ QualifiedName** attrs = getAttrs(&length);
+ mapLoweredLocalNameToName(caseMap, attrs, length);
}
NamedNodeMap* attributes = token.attributes();
@@ -716,9 +703,14 @@ void adjustSVGAttributes(AtomicHTMLToken& token)
}
}
-void adjustMathMLAttributes(AtomicHTMLToken&)
+void adjustSVGAttributes(AtomicHTMLToken& token)
{
- notImplemented();
+ adjustAttributes<SVGNames::getSVGAttrs>(token);
+}
+
+void adjustMathMLAttributes(AtomicHTMLToken& token)
+{
+ adjustAttributes<MathMLNames::getMathMLAttrs>(token);
}
void addNamesWithPrefix(PrefixedNameToQualifiedNameMap* map, const AtomicString& prefix, QualifiedName** names, size_t length)
@@ -770,7 +762,9 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
return;
}
if (token.name() == baseTag
- || token.name() == "command"
+ || token.name() == basefontTag
+ || token.name() == bgsoundTag
+ || token.name() == commandTag
|| token.name() == linkTag
|| token.name() == metaTag
|| token.name() == noframesTag
@@ -805,12 +799,13 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
|| token.name() == asideTag
|| token.name() == blockquoteTag
|| token.name() == centerTag
- || token.name() == "details"
+ || token.name() == detailsTag
|| token.name() == dirTag
|| token.name() == divTag
|| token.name() == dlTag
|| token.name() == fieldsetTag
- || token.name() == "figure"
+ || token.name() == figcaptionTag
+ || token.name() == figureTag
|| token.name() == footerTag
|| token.name() == headerTag
|| token.name() == hgroupTag
@@ -819,13 +814,14 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
|| token.name() == olTag
|| token.name() == pTag
|| token.name() == sectionTag
+ || token.name() == summaryTag
|| token.name() == ulTag) {
- processFakePEndTagIfPInScope();
+ processFakePEndTagIfPInButtonScope();
m_tree.insertHTMLElement(token);
return;
}
if (isNumberedHeaderTag(token.name())) {
- processFakePEndTagIfPInScope();
+ processFakePEndTagIfPInButtonScope();
if (isNumberedHeaderTag(m_tree.currentElement()->localName())) {
parseError(token);
m_tree.openElements()->pop();
@@ -834,7 +830,7 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
return;
}
if (token.name() == preTag || token.name() == listingTag) {
- processFakePEndTagIfPInScope();
+ processFakePEndTagIfPInButtonScope();
m_tree.insertHTMLElement(token);
m_tokenizer->skipLeadingNewLineForListing();
m_framesetOk = false;
@@ -845,7 +841,7 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
parseError(token);
return;
}
- processFakePEndTagIfPInScope();
+ processFakePEndTagIfPInButtonScope();
m_tree.insertHTMLFormElement(token);
return;
}
@@ -858,7 +854,7 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
return;
}
if (token.name() == plaintextTag) {
- processFakePEndTagIfPInScope();
+ processFakePEndTagIfPInButtonScope();
m_tree.insertHTMLElement(token);
m_tokenizer->setState(HTMLTokenizer::PLAINTEXTState);
return;
@@ -927,8 +923,6 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
// Note the fall through to the imgTag handling below!
}
if (token.name() == areaTag
- || token.name() == basefontTag
- || token.name() == "bgsound"
|| token.name() == brTag
|| token.name() == embedTag
|| token.name() == imgTag
@@ -942,12 +936,12 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
}
if (token.name() == paramTag
|| token.name() == sourceTag
- || token.name() == "track") {
+ || token.name() == trackTag) {
m_tree.insertSelfClosingHTMLElement(token);
return;
}
if (token.name() == hrTag) {
- processFakePEndTagIfPInScope();
+ processFakePEndTagIfPInButtonScope();
m_tree.insertSelfClosingHTMLElement(token);
m_framesetOk = false;
return;
@@ -966,7 +960,7 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
return;
}
if (token.name() == xmpTag) {
- processFakePEndTagIfPInScope();
+ processFakePEndTagIfPInButtonScope();
m_tree.reconstructTheActiveFormattingElements();
m_framesetOk = false;
processGenericRawTextStartTag(token);
@@ -1231,6 +1225,8 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
return;
}
if (token.name() == baseTag
+ || token.name() == basefontTag
+ || token.name() == bgsoundTag
|| token.name() == linkTag
|| token.name() == metaTag
|| token.name() == noframesTag
@@ -1376,7 +1372,9 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
m_tree.insertHTMLHtmlStartTagInBody(token);
return;
}
- if (token.name() == linkTag
+ if (token.name() == basefontTag
+ || token.name() == bgsoundTag
+ || token.name() == linkTag
|| token.name() == metaTag
|| token.name() == noframesTag
|| token.name() == styleTag) {
@@ -1935,12 +1933,12 @@ void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken& token)
|| token.name() == blockquoteTag
|| token.name() == buttonTag
|| token.name() == centerTag
- || token.name() == "details"
+ || token.name() == detailsTag
|| token.name() == dirTag
|| token.name() == divTag
|| token.name() == dlTag
|| token.name() == fieldsetTag
- || token.name() == "figure"
+ || token.name() == figureTag
|| token.name() == footerTag
|| token.name() == headerTag
|| token.name() == hgroupTag
@@ -1973,7 +1971,7 @@ void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken& token)
m_tree.openElements()->remove(node.get());
}
if (token.name() == pTag) {
- if (!m_tree.openElements()->inScope(token.name())) {
+ if (!m_tree.openElements()->inButtonScope(token.name())) {
parseError(token);
processFakeStartTag(pTag);
ASSERT(m_tree.openElements()->inScope(token.name()));
@@ -2010,14 +2008,14 @@ void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken& token)
return;
}
if (isNumberedHeaderTag(token.name())) {
- if (!m_tree.openElements()->inScope(token.name())) {
+ if (!m_tree.openElements()->hasNumberedHeaderElementInScope()) {
parseError(token);
return;
}
m_tree.generateImpliedEndTags();
if (!m_tree.currentElement()->hasLocalName(token.name()))
parseError(token);
- m_tree.openElements()->popUntilPopped(token.name());
+ m_tree.openElements()->popUntilNumberedHeaderElementPopped();
return;
}
if (token.name() == "sarcasm") {
@@ -2434,10 +2432,6 @@ void HTMLTreeBuilder::processComment(AtomicHTMLToken& token)
void HTMLTreeBuilder::processCharacter(AtomicHTMLToken& token)
{
ASSERT(token.type() == HTMLToken::Character);
- // FIXME: Currently this design has an extra memcpy because we copy the
- // characters out of the HTMLTokenizer's buffer into the AtomicHTMLToken
- // and then into the text node. What we'd really like is to copy directly
- // from the HTMLTokenizer's buffer into the text node.
ExternalCharacterTokenBuffer buffer(token);
processCharacterBuffer(buffer);
}
@@ -2735,9 +2729,10 @@ bool HTMLTreeBuilder::processStartTagForInHead(AtomicHTMLToken& token)
m_tree.insertHTMLHtmlStartTagInBody(token);
return true;
}
- // FIXME: Atomize "command".
if (token.name() == baseTag
- || token.name() == "command"
+ || token.name() == basefontTag
+ || token.name() == bgsoundTag
+ || token.name() == commandTag
|| token.name() == linkTag
|| token.name() == metaTag) {
m_tree.insertSelfClosingHTMLElement(token);