2011-06-28  Dimitri Glazkov  <dglazkov@chromium.org>

        Reviewed by Kent Tamura.

        Store shadowPseudoId in ElementRareData.
        https://bugs.webkit.org/show_bug.cgi?id=63604

        No new tests, because the code isn't yet used.

        * css/CSSSelector.cpp:
        (WebCore::CSSSelector::isUnknownPseudoType): Added convenience helper.
        * css/CSSSelector.h: Added decl.
        * dom/Element.cpp:
        (WebCore::Element::shadowPseudoId): Changed to use ElementRareData.
        (WebCore::Element::setShadowPseudoId): Ditto.
        * dom/Element.h: Added decls.
        * dom/ElementRareData.h: Added a member to keep shadowPseudoId.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@89989 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 450e690..a16b4b9 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,21 @@
+2011-06-28  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Reviewed by Kent Tamura.
+
+        Store shadowPseudoId in ElementRareData.
+        https://bugs.webkit.org/show_bug.cgi?id=63604
+
+        No new tests, because the code isn't yet used.
+
+        * css/CSSSelector.cpp:
+        (WebCore::CSSSelector::isUnknownPseudoType): Added convenience helper.
+        * css/CSSSelector.h: Added decl.
+        * dom/Element.cpp:
+        (WebCore::Element::shadowPseudoId): Changed to use ElementRareData.
+        (WebCore::Element::setShadowPseudoId): Ditto.
+        * dom/Element.h: Added decls.
+        * dom/ElementRareData.h: Added a member to keep shadowPseudoId.
+
 2011-06-28  Kenichi Ishibashi  <bashi@chromium.org>
 
         Reviewed by Tony Chang.
diff --git a/Source/WebCore/css/CSSSelector.cpp b/Source/WebCore/css/CSSSelector.cpp
index 4a3266f..cda4045 100644
--- a/Source/WebCore/css/CSSSelector.cpp
+++ b/Source/WebCore/css/CSSSelector.cpp
@@ -392,6 +392,11 @@
     return slot == nameToPseudoType->end() ? PseudoUnknown : slot->second;
 }
 
+bool CSSSelector::isUnknownPseudoType(const AtomicString& name)
+{
+    return parsePseudoType(name) == PseudoUnknown;
+}
+
 void CSSSelector::extractPseudoType() const
 {
     if (m_match != PseudoClass && m_match != PseudoElement && m_match != PagePseudoClass)
diff --git a/Source/WebCore/css/CSSSelector.h b/Source/WebCore/css/CSSSelector.h
index abd10e4..c589f75 100644
--- a/Source/WebCore/css/CSSSelector.h
+++ b/Source/WebCore/css/CSSSelector.h
@@ -213,6 +213,7 @@
         }
 
         static PseudoType parsePseudoType(const AtomicString&);
+        static bool isUnknownPseudoType(const AtomicString&);
         static PseudoId pseudoId(PseudoType);
 
         // Selectors are kept in an array by CSSSelectorList. The next component of the selector is 
diff --git a/Source/WebCore/dom/Element.cpp b/Source/WebCore/dom/Element.cpp
index d190e56..3027391 100644
--- a/Source/WebCore/dom/Element.cpp
+++ b/Source/WebCore/dom/Element.cpp
@@ -1234,6 +1234,24 @@
     }
 }
 
+const AtomicString& Element::shadowPseudoId() const
+{
+    return hasRareData() ? rareData()->m_shadowPseudoId : nullAtom;
+}
+
+void Element::setShadowPseudoId(const AtomicString& id, ExceptionCode& ec)
+{
+    if (!hasRareData() && id == nullAtom)
+        return;
+
+    if (!CSSSelector::isUnknownPseudoType(id)) {
+        ec = SYNTAX_ERR;
+        return;
+    }
+
+    ensureRareData()->m_shadowPseudoId = id;
+}
+
 bool Element::childTypeAllowed(NodeType type) const
 {
     switch (type) {
diff --git a/Source/WebCore/dom/Element.h b/Source/WebCore/dom/Element.h
index 90dad64..5a04862 100644
--- a/Source/WebCore/dom/Element.h
+++ b/Source/WebCore/dom/Element.h
@@ -235,6 +235,7 @@
     void removeShadowRoot();
 
     virtual const AtomicString& shadowPseudoId() const;
+    void setShadowPseudoId(const AtomicString&, ExceptionCode&);
 
     RenderStyle* computedStyle(PseudoId = NOPSEUDO);
 
@@ -542,11 +543,6 @@
     setAttribute(document()->idAttributeName(), value);
 }
 
-inline const AtomicString& Element::shadowPseudoId() const
-{
-    return nullAtom;
-}
-    
 inline Element* firstElementChild(const ContainerNode* container)
 {
     ASSERT_ARG(container, container);
diff --git a/Source/WebCore/dom/ElementRareData.h b/Source/WebCore/dom/ElementRareData.h
index 5a65edb..7277a6f 100644
--- a/Source/WebCore/dom/ElementRareData.h
+++ b/Source/WebCore/dom/ElementRareData.h
@@ -45,6 +45,7 @@
     IntSize m_minimumSizeForResizing;
     RefPtr<RenderStyle> m_computedStyle;
     ShadowRoot* m_shadowRoot;
+    AtomicString m_shadowPseudoId;
 
     OwnPtr<DatasetDOMStringMap> m_datasetDOMStringMap;
     OwnPtr<ClassList> m_classList;