Title: [140403] trunk/Source/WebCore
Revision
140403
Author
aba...@webkit.org
Date
2013-01-22 02:26:20 -0800 (Tue, 22 Jan 2013)

Log Message

AtomicMarkupTokenBase must die
https://bugs.webkit.org/show_bug.cgi?id=107513

Reviewed by Eric Seidel.

Now that NEW_XML has been removed from the tree, there is no reason to
have AtomicMarkupTokenBase exist as a templated base class for
AtomicHTMLToken. This patch just merges the code back into
AtomicHTMLToken.

* html/parser/HTMLToken.h:
(AtomicHTMLToken):
(WebCore::AtomicHTMLToken::type):
(WebCore::AtomicHTMLToken::name):
(WebCore::AtomicHTMLToken::setName):
(WebCore::AtomicHTMLToken::selfClosing):
(WebCore::AtomicHTMLToken::getAttributeItem):
(WebCore::AtomicHTMLToken::attributes):
(WebCore::AtomicHTMLToken::characters):
(WebCore::AtomicHTMLToken::charactersLength):
(WebCore::AtomicHTMLToken::isAll8BitData):
(WebCore::AtomicHTMLToken::comment):
(WebCore::AtomicHTMLToken::publicIdentifier):
(WebCore::AtomicHTMLToken::systemIdentifier):
(WebCore::AtomicHTMLToken::clearExternalCharacters):
(WebCore::AtomicHTMLToken::AtomicHTMLToken):
(WebCore::AtomicMarkupTokenBase::initializeAttributes):
(WebCore):
* xml/parser/MarkupTokenBase.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (140402 => 140403)


--- trunk/Source/WebCore/ChangeLog	2013-01-22 10:24:30 UTC (rev 140402)
+++ trunk/Source/WebCore/ChangeLog	2013-01-22 10:26:20 UTC (rev 140403)
@@ -1,3 +1,35 @@
+2013-01-22  Adam Barth  <aba...@webkit.org>
+
+        AtomicMarkupTokenBase must die
+        https://bugs.webkit.org/show_bug.cgi?id=107513
+
+        Reviewed by Eric Seidel.
+
+        Now that NEW_XML has been removed from the tree, there is no reason to
+        have AtomicMarkupTokenBase exist as a templated base class for
+        AtomicHTMLToken. This patch just merges the code back into
+        AtomicHTMLToken.
+
+        * html/parser/HTMLToken.h:
+        (AtomicHTMLToken):
+        (WebCore::AtomicHTMLToken::type):
+        (WebCore::AtomicHTMLToken::name):
+        (WebCore::AtomicHTMLToken::setName):
+        (WebCore::AtomicHTMLToken::selfClosing):
+        (WebCore::AtomicHTMLToken::getAttributeItem):
+        (WebCore::AtomicHTMLToken::attributes):
+        (WebCore::AtomicHTMLToken::characters):
+        (WebCore::AtomicHTMLToken::charactersLength):
+        (WebCore::AtomicHTMLToken::isAll8BitData):
+        (WebCore::AtomicHTMLToken::comment):
+        (WebCore::AtomicHTMLToken::publicIdentifier):
+        (WebCore::AtomicHTMLToken::systemIdentifier):
+        (WebCore::AtomicHTMLToken::clearExternalCharacters):
+        (WebCore::AtomicHTMLToken::AtomicHTMLToken):
+        (WebCore::AtomicMarkupTokenBase::initializeAttributes):
+        (WebCore):
+        * xml/parser/MarkupTokenBase.h:
+
 2013-01-22  Eric Seidel  <e...@webkit.org>
 
         Turn on ENABLE_THREADED_HTML_PARSER for Chromium (it's still disabled at runtime)

Modified: trunk/Source/WebCore/html/parser/HTMLToken.h (140402 => 140403)


--- trunk/Source/WebCore/html/parser/HTMLToken.h	2013-01-22 10:24:30 UTC (rev 140402)
+++ trunk/Source/WebCore/html/parser/HTMLToken.h	2013-01-22 10:26:20 UTC (rev 140403)
@@ -61,7 +61,7 @@
     }
 };
 
-class AtomicHTMLToken : public AtomicMarkupTokenBase<HTMLToken>, public RefCounted<AtomicHTMLToken> {
+class AtomicHTMLToken : public RefCounted<AtomicHTMLToken> {
     WTF_MAKE_NONCOPYABLE(AtomicHTMLToken);
 public:
     static PassRefPtr<AtomicHTMLToken> create(HTMLToken& token)
@@ -88,16 +88,130 @@
         ASSERT(m_type == HTMLTokenTypes::DOCTYPE);
         return m_doctypeData->m_forceQuirks;
     }
+
+    HTMLTokenTypes::Type type() const { return m_type; }
+
+    const AtomicString& name() const
+    {
+        ASSERT(usesName());
+        return m_name;
+    }
+
+    void setName(const AtomicString& name)
+    {
+        ASSERT(usesName());
+        m_name = name;
+    }
+
+    bool selfClosing() const
+    {
+        ASSERT(m_type == HTMLTokenTypes::StartTag || m_type == HTMLTokenTypes::EndTag);
+        return m_selfClosing;
+    }
+
+    Attribute* getAttributeItem(const QualifiedName& attributeName)
+    {
+        ASSERT(usesAttributes());
+        return findAttributeInVector(m_attributes, attributeName);
+    }
+
+    Vector<Attribute>& attributes()
+    {
+        ASSERT(usesAttributes());
+        return m_attributes;
+    }
+
+    const Vector<Attribute>& attributes() const
+    {
+        ASSERT(usesAttributes());
+        return m_attributes;
+    }
+
+    const UChar* characters() const
+    {
+        ASSERT(m_type == HTMLTokenTypes::Character);
+        return m_externalCharacters;
+    }
+
+    size_t charactersLength() const
+    {
+        ASSERT(m_type == HTMLTokenTypes::Character);
+        return m_externalCharactersLength;
+    }
+
+    bool isAll8BitData() const
+    {
+        return m_isAll8BitData;
+    }
+
+    const String& comment() const
+    {
+        ASSERT(m_type == HTMLTokenTypes::Comment);
+        return m_data;
+    }
+
+    // FIXME: Distinguish between a missing public identifer and an empty one.
+    WTF::Vector<UChar>& publicIdentifier() const
+    {
+        ASSERT(m_type == HTMLTokenTypes::DOCTYPE);
+        return m_doctypeData->m_publicIdentifier;
+    }
+
+    // FIXME: Distinguish between a missing system identifer and an empty one.
+    WTF::Vector<UChar>& systemIdentifier() const
+    {
+        ASSERT(m_type == HTMLTokenTypes::DOCTYPE);
+        return m_doctypeData->m_systemIdentifier;
+    }
+
+    void clearExternalCharacters()
+    {
+        m_externalCharacters = 0;
+        m_externalCharactersLength = 0;
+        m_isAll8BitData = false;
+    }
+
 private:
     explicit AtomicHTMLToken(HTMLToken& token)
-        : AtomicMarkupTokenBase<HTMLToken>(&token)
+        : m_type(token.type())
     {
+        switch (m_type) {
+        case HTMLTokenTypes::Uninitialized:
+            ASSERT_NOT_REACHED();
+            break;
+        case HTMLTokenTypes::DOCTYPE:
+            m_name = AtomicString(token.nameString());
+            m_doctypeData = token.releaseDoctypeData();
+            break;
+        case HTMLTokenTypes::EndOfFile:
+            break;
+        case HTMLTokenTypes::StartTag:
+        case HTMLTokenTypes::EndTag: {
+            m_selfClosing = token.selfClosing();
+            m_name = AtomicString(token.nameString());
+            initializeAttributes(token.attributes());
+            break;
+        }
+        case HTMLTokenTypes::Comment:
+            if (token.isAll8BitData())
+                m_data = String::make8BitFrom16BitSource(token.comment().data(), token.comment().size());
+            else
+                m_data = String(token.comment().data(), token.comment().size());
+            break;
+        case HTMLTokenTypes::Character:
+            m_externalCharacters = token.characters().data();
+            m_externalCharactersLength = token.characters().size();
+            m_isAll8BitData = token.isAll8BitData();
+            break;
+        default:
+            break;
+        }
     }
 
 #if ENABLE(THREADED_HTML_PARSER)
 
     explicit AtomicHTMLToken(const CompactHTMLToken& token)
-        : AtomicMarkupTokenBase<HTMLToken>(token.type())
+        : m_type(token.type())
     {
         switch (m_type) {
         case HTMLTokenTypes::Uninitialized:
@@ -136,12 +250,90 @@
 
 #endif
 
+    explicit AtomicHTMLToken(HTMLTokenTypes::Type type)
+        : m_type(type)
+        , m_externalCharacters(0)
+        , m_externalCharactersLength(0)
+        , m_isAll8BitData(false)
+        , m_selfClosing(false)
+    {
+    }
+
     AtomicHTMLToken(HTMLTokenTypes::Type type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>())
-        : AtomicMarkupTokenBase<HTMLToken>(type, name, attributes)
+        : m_type(type)
+        , m_name(name)
+        , m_externalCharacters(0)
+        , m_externalCharactersLength(0)
+        , m_isAll8BitData(false)
+        , m_selfClosing(false)
+        , m_attributes(attributes)
     {
+        ASSERT(usesName());
     }
+
+    HTMLTokenTypes::Type m_type;
+
+    void initializeAttributes(const HTMLToken::AttributeList& attributes);
+    QualifiedName nameForAttribute(const HTMLToken::Attribute&) const;
+
+    bool usesName() const;
+
+    bool usesAttributes() const;
+
+    // "name" for DOCTYPE, StartTag, and EndTag
+    AtomicString m_name;
+
+    // "data" for Comment
+    String m_data;
+
+    // "characters" for Character
+    //
+    // We don't want to copy the the characters out of the Token, so we
+    // keep a pointer to its buffer instead. This buffer is owned by the
+    // Token and causes a lifetime dependence between these objects.
+    //
+    // FIXME: Add a mechanism for "internalizing" the characters when the
+    //        HTMLToken is destructed.
+    const UChar* m_externalCharacters;
+    size_t m_externalCharactersLength;
+    bool m_isAll8BitData;
+
+    // For DOCTYPE
+    OwnPtr<HTMLTokenTypes::DoctypeData> m_doctypeData;
+
+    // For StartTag and EndTag
+    bool m_selfClosing;
+
+    Vector<Attribute> m_attributes;
 };
 
+inline void AtomicHTMLToken::initializeAttributes(const HTMLToken::AttributeList& attributes)
+{
+    size_t size = attributes.size();
+    if (!size)
+        return;
+
+    m_attributes.clear();
+    m_attributes.reserveInitialCapacity(size);
+    for (size_t i = 0; i < size; ++i) {
+        const HTMLToken::Attribute& attribute = attributes[i];
+        if (attribute.m_name.isEmpty())
+            continue;
+
+        // FIXME: We should be able to add the following ASSERT once we fix
+        // https://bugs.webkit.org/show_bug.cgi?id=62971
+        //   ASSERT(attribute.m_nameRange.m_start);
+        ASSERT(attribute.m_nameRange.m_end);
+        ASSERT(attribute.m_valueRange.m_start);
+        ASSERT(attribute.m_valueRange.m_end);
+
+        AtomicString value(attribute.m_value.data(), attribute.m_value.size());
+        const QualifiedName& name = nameForAttribute(attribute);
+        if (!findAttributeInVector(m_attributes, name))
+            m_attributes.append(Attribute(name, value));
+    }
 }
 
+}
+
 #endif

Modified: trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp (140402 => 140403)


--- trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp	2013-01-22 10:24:30 UTC (rev 140402)
+++ trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp	2013-01-22 10:26:20 UTC (rev 140403)
@@ -49,20 +49,17 @@
 
 // This has to go in a .cpp file, as the linker doesn't like it being included more than once.
 // We don't have an HTMLToken.cpp though, so this is the next best place.
-template<>
-QualifiedName AtomicMarkupTokenBase<HTMLToken>::nameForAttribute(const AttributeBase& attribute) const
+QualifiedName AtomicHTMLToken::nameForAttribute(const AttributeBase& attribute) const
 {
     return QualifiedName(nullAtom, AtomicString(attribute.m_name.data(), attribute.m_name.size()), nullAtom);
 }
 
-template<>
-bool AtomicMarkupTokenBase<HTMLToken>::usesName() const
+bool AtomicHTMLToken::usesName() const
 {
     return m_type == HTMLTokenTypes::StartTag || m_type == HTMLTokenTypes::EndTag || m_type == HTMLTokenTypes::DOCTYPE;
 }
 
-template<>
-bool AtomicMarkupTokenBase<HTMLToken>::usesAttributes() const
+bool AtomicHTMLToken::usesAttributes() const
 {
     return m_type == HTMLTokenTypes::StartTag || m_type == HTMLTokenTypes::EndTag;
 }

Modified: trunk/Source/WebCore/xml/parser/MarkupTokenBase.h (140402 => 140403)


--- trunk/Source/WebCore/xml/parser/MarkupTokenBase.h	2013-01-22 10:24:30 UTC (rev 140402)
+++ trunk/Source/WebCore/xml/parser/MarkupTokenBase.h	2013-01-22 10:26:20 UTC (rev 140403)
@@ -45,7 +45,6 @@
     return 0;
 }
 
-
 class DoctypeDataBase {
     WTF_MAKE_NONCOPYABLE(DoctypeDataBase); WTF_MAKE_FAST_ALLOCATED;
 public:
@@ -376,6 +375,25 @@
         m_doctypeData->m_systemIdentifier.append(character);
     }
 
+    const DataVector& name() const
+    {
+        return m_data;
+    }
+
+    String nameString() const
+    {
+        if (!m_data.size())
+            return emptyString();
+        if (isAll8BitData())
+            return String::make8BitFrom16BitSource(m_data.data(), m_data.size());
+        return String(m_data.data(), m_data.size());
+    }
+
+    PassOwnPtr<DoctypeData> releaseDoctypeData()
+    {
+        return m_doctypeData.release();
+    }
+
 protected:
 
 #ifndef NDEBUG
@@ -394,26 +412,6 @@
         m_orAllData |= character;
     }
 
-    const DataVector& name() const
-    {
-        return m_data;
-    }
-
-    String nameString() const
-    {
-        if (!m_data.size())
-            return emptyString();
-        if (isAll8BitData())
-            return String::make8BitFrom16BitSource(m_data.data(), m_data.size());
-        return String(m_data.data(), m_data.size());
-    }
-
-    // FIXME: I'm not sure what the final relationship between MarkupTokenBase and
-    // AtomicMarkupTokenBase will be. I'm marking this a friend for now, but we'll
-    // want to end up with a cleaner interface between the two classes.
-    template<typename Token>
-    friend class AtomicMarkupTokenBase;
-
     typename Type::Type m_type;
     typename Attribute::Range m_range; // Always starts at zero.
     int m_baseOffset;
@@ -431,215 +429,6 @@
     Attribute* m_currentAttribute;
 };
 
-template<typename Token>
-class AtomicMarkupTokenBase {
-    WTF_MAKE_NONCOPYABLE(AtomicMarkupTokenBase);
-public:
-    AtomicMarkupTokenBase(Token* token)
-        : m_type(token->type())
-    {
-        ASSERT(token);
-
-        switch (m_type) {
-        case Token::Type::Uninitialized:
-            ASSERT_NOT_REACHED();
-            break;
-        case Token::Type::DOCTYPE:
-            m_name = AtomicString(token->nameString());
-            m_doctypeData = token->m_doctypeData.release();
-            break;
-        case Token::Type::EndOfFile:
-            break;
-        case Token::Type::StartTag:
-        case Token::Type::EndTag: {
-            m_selfClosing = token->selfClosing();
-            m_name = AtomicString(token->nameString());
-            initializeAttributes(token->attributes());
-            break;
-        }
-        case Token::Type::Comment:
-            if (token->isAll8BitData())
-                m_data = String::make8BitFrom16BitSource(token->comment().data(), token->comment().size());
-            else
-                m_data = String(token->comment().data(), token->comment().size());
-            break;
-        case Token::Type::Character:
-            m_externalCharacters = token->characters().data();
-            m_externalCharactersLength = token->characters().size();
-            m_isAll8BitData = token->isAll8BitData();
-            break;
-        default:
-            break;
-        }
-    }
-
-    explicit AtomicMarkupTokenBase(typename Token::Type::Type type)
-        : m_type(type)
-        , m_externalCharacters(0)
-        , m_externalCharactersLength(0)
-        , m_isAll8BitData(false)
-        , m_selfClosing(false)
-    {
-    }
-
-    AtomicMarkupTokenBase(typename Token::Type::Type type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>())
-        : m_type(type)
-        , m_name(name)
-        , m_externalCharacters(0)
-        , m_externalCharactersLength(0)
-        , m_isAll8BitData(false)
-        , m_attributes(attributes)
-    {
-        ASSERT(usesName());
-    }
-
-    typename Token::Type::Type type() const { return m_type; }
-
-    const AtomicString& name() const
-    {
-        ASSERT(usesName());
-        return m_name;
-    }
-
-    void setName(const AtomicString& name)
-    {
-        ASSERT(usesName());
-        m_name = name;
-    }
-
-    bool selfClosing() const
-    {
-        ASSERT(m_type == Token::Type::StartTag || m_type == Token::Type::EndTag);
-        return m_selfClosing;
-    }
-
-    Attribute* getAttributeItem(const QualifiedName& attributeName)
-    {
-        ASSERT(usesAttributes());
-        return findAttributeInVector(m_attributes, attributeName);
-    }
-
-    Vector<Attribute>& attributes()
-    {
-        ASSERT(usesAttributes());
-        return m_attributes;
-    }
-
-    const Vector<Attribute>& attributes() const
-    {
-        ASSERT(usesAttributes());
-        return m_attributes;
-    }
-
-    const UChar* characters() const
-    {
-        ASSERT(m_type == Token::Type::Character);
-        return m_externalCharacters;
-    }
-
-    size_t charactersLength() const
-    {
-        ASSERT(m_type == Token::Type::Character);
-        return m_externalCharactersLength;
-    }
-
-    bool isAll8BitData() const
-    {
-        return m_isAll8BitData;
-    }
-
-    const String& comment() const
-    {
-        ASSERT(m_type == Token::Type::Comment);
-        return m_data;
-    }
-
-    // FIXME: Distinguish between a missing public identifer and an empty one.
-    WTF::Vector<UChar>& publicIdentifier() const
-    {
-        ASSERT(m_type == Token::Type::DOCTYPE);
-        return m_doctypeData->m_publicIdentifier;
-    }
-
-    // FIXME: Distinguish between a missing system identifer and an empty one.
-    WTF::Vector<UChar>& systemIdentifier() const
-    {
-        ASSERT(m_type == Token::Type::DOCTYPE);
-        return m_doctypeData->m_systemIdentifier;
-    }
-
-    void clearExternalCharacters()
-    {
-        m_externalCharacters = 0;
-        m_externalCharactersLength = 0;
-        m_isAll8BitData = false;
-    }
-
-protected:
-    typename Token::Type::Type m_type;
-
-    void initializeAttributes(const typename Token::AttributeList& attributes);
-    QualifiedName nameForAttribute(const typename Token::Attribute&) const;
-
-    bool usesName() const;
-
-    bool usesAttributes() const;
-
-    // "name" for DOCTYPE, StartTag, and EndTag
-    AtomicString m_name;
-
-    // "data" for Comment
-    String m_data;
-
-    // "characters" for Character
-    //
-    // We don't want to copy the the characters out of the Token, so we
-    // keep a pointer to its buffer instead. This buffer is owned by the
-    // Token and causes a lifetime dependence between these objects.
-    //
-    // FIXME: Add a mechanism for "internalizing" the characters when the
-    //        HTMLToken is destructed.
-    const UChar* m_externalCharacters;
-    size_t m_externalCharactersLength;
-    bool m_isAll8BitData;
-
-    // For DOCTYPE
-    OwnPtr<typename Token::DoctypeData> m_doctypeData;
-
-    // For StartTag and EndTag
-    bool m_selfClosing;
-
-    Vector<Attribute> m_attributes;
-};
-
-template<typename Token>
-inline void AtomicMarkupTokenBase<Token>::initializeAttributes(const typename Token::AttributeList& attributes)
-{
-    size_t size = attributes.size();
-    if (!size)
-        return;
-
-    m_attributes.clear();
-    m_attributes.reserveInitialCapacity(size);
-    for (size_t i = 0; i < size; ++i) {
-        const typename Token::Attribute& attribute = attributes[i];
-        if (attribute.m_name.isEmpty())
-            continue;
-
-        // FIXME: We should be able to add the following ASSERT once we fix
-        // https://bugs.webkit.org/show_bug.cgi?id=62971
-        //   ASSERT(attribute.m_nameRange.m_start);
-        ASSERT(attribute.m_nameRange.m_end);
-        ASSERT(attribute.m_valueRange.m_start);
-        ASSERT(attribute.m_valueRange.m_end);
-
-        AtomicString value(attribute.m_value.data(), attribute.m_value.size());
-        const QualifiedName& name = nameForAttribute(attribute);
-        if (!findAttributeInVector(m_attributes, name))
-            m_attributes.append(Attribute(name, value));
-    }
 }
 
-}
-
 #endif // MarkupTokenBase_h
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to