summaryrefslogtreecommitdiffstats
path: root/WebCore/html/HTML5TreeBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/html/HTML5TreeBuilder.cpp')
-rw-r--r--WebCore/html/HTML5TreeBuilder.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/WebCore/html/HTML5TreeBuilder.cpp b/WebCore/html/HTML5TreeBuilder.cpp
new file mode 100644
index 0000000..af53ac6
--- /dev/null
+++ b/WebCore/html/HTML5TreeBuilder.cpp
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2010 Google, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "HTML5TreeBuilder.h"
+
+#include "Attribute.h"
+#include "HTML5Lexer.h"
+#include "HTML5Token.h"
+#include "HTMLDocument.h"
+#include "HTMLParser.h"
+#include "HTMLTokenizer.h"
+#include "NotImplemented.h"
+
+namespace WebCore {
+
+HTML5TreeBuilder::HTML5TreeBuilder(HTML5Lexer* lexer, HTMLDocument* document, bool reportErrors)
+ : m_document(document)
+ , m_reportErrors(reportErrors)
+ , m_lexer(lexer)
+ , m_legacyHTMLParser(new HTMLParser(document, reportErrors))
+{
+}
+
+HTML5TreeBuilder::~HTML5TreeBuilder()
+{
+}
+
+static void convertToOldStyle(HTML5Token& token, Token& oldStyleToken)
+{
+ switch (token.type()) {
+ case HTML5Token::Uninitialized:
+ ASSERT_NOT_REACHED();
+ break;
+ case HTML5Token::DOCTYPE:
+ case HTML5Token::EndOfFile:
+ ASSERT_NOT_REACHED();
+ notImplemented();
+ break;
+ case HTML5Token::StartTag:
+ case HTML5Token::EndTag: {
+ oldStyleToken.beginTag = (token.type() == HTML5Token::StartTag);
+ oldStyleToken.selfClosingTag = token.selfClosing();
+ oldStyleToken.tagName = token.name();
+ HTML5Token::AttributeList& attributes = token.attributes();
+ for (HTML5Token::AttributeList::iterator iter = attributes.begin();
+ iter != attributes.end(); ++iter) {
+ if (!iter->m_name.isEmpty()) {
+ String name = String(StringImpl::adopt(iter->m_name));
+ String value = String(StringImpl::adopt(iter->m_value));
+ RefPtr<Attribute> mappedAttribute = Attribute::createMapped(name, value);
+ if (!oldStyleToken.attrs)
+ oldStyleToken.attrs = NamedNodeMap::create();
+ oldStyleToken.attrs->insertAttribute(mappedAttribute.release(), false);
+ }
+ }
+ break;
+ }
+ case HTML5Token::Comment:
+ oldStyleToken.tagName = commentAtom;
+ oldStyleToken.text = token.data().impl();
+ break;
+ case HTML5Token::Character:
+ oldStyleToken.tagName = textAtom;
+ oldStyleToken.text = token.characters().impl();
+ break;
+ }
+}
+
+PassRefPtr<Node> HTML5TreeBuilder::passTokenToLegacyParser(HTML5Token& token)
+{
+ if (token.type() == HTML5Token::StartTag && token.name() == "script") {
+ // This work is supposed to be done by the parser, but
+ // when using the old parser for we have to do this manually.
+ m_lexer->setState(HTML5Lexer::ScriptDataState);
+ }
+ // For now, we translate into an old-style token for testing.
+ Token oldStyleToken;
+ convertToOldStyle(token, oldStyleToken);
+
+ return m_legacyHTMLParser->parseToken(&oldStyleToken);
+}
+
+PassRefPtr<Node> HTML5TreeBuilder::constructTreeFromToken(HTML5Token& token)
+{
+ return passTokenToLegacyParser(token);
+ // Our HTML5 parser implementation will go here in a separate patch.
+}
+
+void HTML5TreeBuilder::finished()
+{
+ m_legacyHTMLParser->finished();
+}
+
+}