Title: [101061] trunk/Source/WebCore
Revision
101061
Author
[email protected]
Date
2011-11-23 02:46:04 -0800 (Wed, 23 Nov 2011)

Log Message

[MutationObservers] Cleanup duplicated code in Element & CharacterData
https://bugs.webkit.org/show_bug.cgi?id=72986

Patch by Rafael Weinstein <[email protected]> on 2011-11-23
Reviewed by Ojan Vafai.

This patch creates a MutationObserverInterestGroup which represents the set
of MutationObservers which should receive all mutations of a given type generated
from a specific node.

No tests needed. This patch is only a refactor.

* dom/CharacterData.cpp:
(WebCore::CharacterData::dispatchModifiedEvent):
* dom/ChildListMutationScope.cpp:
(WebCore::MutationAccumulationRouter::ChildListMutationAccumulator::ChildListMutationAccumulator):
(WebCore::MutationAccumulationRouter::ChildListMutationAccumulator::enqueueMutationRecord):
(WebCore::MutationAccumulationRouter::MutationAccumulationRouter::incrementScopingLevel):
* dom/Element.cpp:
(WebCore::enqueueAttributesMutationRecord):
* dom/WebKitMutationObserver.cpp:
(WebCore::MutationObserverInterestGroup::createForChildListMutation):
(WebCore::MutationObserverInterestGroup::createForCharacterDataMutation):
(WebCore::MutationObserverInterestGroup::createForAttributesMutation):
(WebCore::MutationObserverInterestGroup::MutationObserverInterestGroup):
(WebCore::MutationObserverInterestGroup::isOldValueRequested):
(WebCore::MutationObserverInterestGroup::enqueueMutationRecord):
* dom/WebKitMutationObserver.h:
(WebCore::MutationObserverInterestGroup::isEmpty):
(WebCore::MutationObserverInterestGroup::hasOldValue):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (101060 => 101061)


--- trunk/Source/WebCore/ChangeLog	2011-11-23 10:35:16 UTC (rev 101060)
+++ trunk/Source/WebCore/ChangeLog	2011-11-23 10:46:04 UTC (rev 101061)
@@ -1,3 +1,35 @@
+2011-11-23  Rafael Weinstein  <[email protected]>
+
+        [MutationObservers] Cleanup duplicated code in Element & CharacterData
+        https://bugs.webkit.org/show_bug.cgi?id=72986
+
+        Reviewed by Ojan Vafai.
+
+        This patch creates a MutationObserverInterestGroup which represents the set
+        of MutationObservers which should receive all mutations of a given type generated
+        from a specific node.
+
+        No tests needed. This patch is only a refactor.
+
+        * dom/CharacterData.cpp:
+        (WebCore::CharacterData::dispatchModifiedEvent):
+        * dom/ChildListMutationScope.cpp:
+        (WebCore::MutationAccumulationRouter::ChildListMutationAccumulator::ChildListMutationAccumulator):
+        (WebCore::MutationAccumulationRouter::ChildListMutationAccumulator::enqueueMutationRecord):
+        (WebCore::MutationAccumulationRouter::MutationAccumulationRouter::incrementScopingLevel):
+        * dom/Element.cpp:
+        (WebCore::enqueueAttributesMutationRecord):
+        * dom/WebKitMutationObserver.cpp:
+        (WebCore::MutationObserverInterestGroup::createForChildListMutation):
+        (WebCore::MutationObserverInterestGroup::createForCharacterDataMutation):
+        (WebCore::MutationObserverInterestGroup::createForAttributesMutation):
+        (WebCore::MutationObserverInterestGroup::MutationObserverInterestGroup):
+        (WebCore::MutationObserverInterestGroup::isOldValueRequested):
+        (WebCore::MutationObserverInterestGroup::enqueueMutationRecord):
+        * dom/WebKitMutationObserver.h:
+        (WebCore::MutationObserverInterestGroup::isEmpty):
+        (WebCore::MutationObserverInterestGroup::hasOldValue):
+
 2011-11-23  Marc-Andre Decoste  <[email protected]>
 
         [chromium] HDC leak in Uniscribe Helper

Modified: trunk/Source/WebCore/dom/CharacterData.cpp (101060 => 101061)


--- trunk/Source/WebCore/dom/CharacterData.cpp	2011-11-23 10:35:16 UTC (rev 101060)
+++ trunk/Source/WebCore/dom/CharacterData.cpp	2011-11-23 10:46:04 UTC (rev 101061)
@@ -188,52 +188,11 @@
         toRenderText(renderer())->setTextWithOffset(m_data.impl(), offsetOfReplacedData, lengthOfReplacedData);
 }
 
-#if ENABLE(MUTATION_OBSERVERS)
-static inline bool hasOldValue(MutationObserverOptions options)
-{
-    return options & WebKitMutationObserver::CharacterDataOldValue;
-}
-
-static bool isOldValueRequested(const HashMap<WebKitMutationObserver*, MutationObserverOptions>& observers)
-{
-    for (HashMap<WebKitMutationObserver*, MutationObserverOptions>::const_iterator iter = observers.begin(); iter != observers.end(); ++iter) {
-        if (hasOldValue(iter->second))
-            return true;
-    }
-    return false;
-}
-
-static void enqueueCharacterDataMutationRecord(Node* node, const String& oldData)
-{
-    HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions> observers;
-    node->getRegisteredMutationObserversOfType(observers, WebKitMutationObserver::CharacterData);
-    if (observers.isEmpty())
-        return;
-
-    // FIXME: Factor this logic out to avoid duplication with attributeOldValue.
-    RefPtr<MutationRecord> mutation = MutationRecord::createCharacterData(node, isOldValueRequested(observers) ? oldData : String());
-    RefPtr<MutationRecord> mutationWithNullOldValue;
-    for (HashMap<WebKitMutationObserver*, MutationObserverOptions>::iterator iter = observers.begin(); iter != observers.end(); ++iter) {
-        WebKitMutationObserver* observer = iter->first;
-        if (hasOldValue(iter->second)) {
-            observer->enqueueMutationRecord(mutation);
-            continue;
-        }
-        if (!mutationWithNullOldValue) {
-            if (mutation->oldValue().isNull())
-                mutationWithNullOldValue = mutation;
-            else
-                mutationWithNullOldValue = MutationRecord::createWithNullOldValue(mutation);
-        }
-        observer->enqueueMutationRecord(mutationWithNullOldValue);
-    }
-}
-#endif // ENABLE(MUTATION_OBSERVERS)
-
 void CharacterData::dispatchModifiedEvent(const String& oldData)
 {
 #if ENABLE(MUTATION_OBSERVERS)
-    enqueueCharacterDataMutationRecord(this, oldData);
+    OwnPtr<MutationObserverInterestGroup> mutationRecipients = MutationObserverInterestGroup::createForCharacterDataMutation(this);
+    mutationRecipients->enqueueMutationRecord(MutationRecord::createCharacterData(this, oldData));
 #endif
     if (parentNode())
         parentNode()->childrenChanged();

Modified: trunk/Source/WebCore/dom/ChildListMutationScope.cpp (101060 => 101061)


--- trunk/Source/WebCore/dom/ChildListMutationScope.cpp	2011-11-23 10:35:16 UTC (rev 101060)
+++ trunk/Source/WebCore/dom/ChildListMutationScope.cpp	2011-11-23 10:46:04 UTC (rev 101061)
@@ -53,7 +53,7 @@
 class ChildListMutationAccumulator : public RefCounted<ChildListMutationAccumulator> {
     WTF_MAKE_NONCOPYABLE(ChildListMutationAccumulator);
 public:
-    ChildListMutationAccumulator(PassRefPtr<Node>, HashMap<WebKitMutationObserver*, MutationObserverOptions>&);
+    ChildListMutationAccumulator(PassRefPtr<Node>, PassOwnPtr<MutationObserverInterestGroup> observers);
     ~ChildListMutationAccumulator();
 
     void childAdded(PassRefPtr<Node>);
@@ -73,7 +73,7 @@
     RefPtr<Node> m_nextSibling;
     RefPtr<Node> m_lastAdded;
 
-    HashMap<WebKitMutationObserver*, MutationObserverOptions> m_observers;
+    OwnPtr<MutationObserverInterestGroup> m_observers;
 };
 
 class MutationAccumulationRouter {
@@ -100,10 +100,10 @@
     static MutationAccumulationRouter* s_instance;
 };
 
-ChildListMutationAccumulator::ChildListMutationAccumulator(PassRefPtr<Node> target, HashMap<WebKitMutationObserver*, MutationObserverOptions>& observers)
+ChildListMutationAccumulator::ChildListMutationAccumulator(PassRefPtr<Node> target, PassOwnPtr<MutationObserverInterestGroup> observers)
     : m_target(target)
+    , m_observers(observers)
 {
-    m_observers.swap(observers);
     clear();
 }
 
@@ -166,12 +166,8 @@
         return;
     }
 
-    RefPtr<MutationRecord> mutation = MutationRecord::createChildList(
-        m_target, StaticNodeList::adopt(m_addedNodes), StaticNodeList::adopt(m_removedNodes), m_previousSibling.release(), m_nextSibling.release());
-
-    for (HashMap<WebKitMutationObserver*, MutationObserverOptions>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter)
-        iter->first->enqueueMutationRecord(mutation);
-
+    m_observers->enqueueMutationRecord(MutationRecord::createChildList(
+            m_target, StaticNodeList::adopt(m_addedNodes), StaticNodeList::adopt(m_removedNodes), m_previousSibling.release(), m_nextSibling.release()));
     clear();
 }
 
@@ -244,12 +240,11 @@
         return;
     }
 
-    HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions> observers;
-    target->getRegisteredMutationObserversOfType(observers, WebKitMutationObserver::ChildList);
-    if (observers.isEmpty())
+    OwnPtr<MutationObserverInterestGroup> observers = MutationObserverInterestGroup::createForChildListMutation(target);
+    if (observers->isEmpty())
         m_accumulations.set(target, 0);
     else
-        m_accumulations.set(target, adoptRef(new ChildListMutationAccumulator(target, observers)));
+        m_accumulations.set(target, adoptRef(new ChildListMutationAccumulator(target, observers.release())));
 }
 
 void MutationAccumulationRouter::decrementScopingLevel(Node* target)

Modified: trunk/Source/WebCore/dom/Element.cpp (101060 => 101061)


--- trunk/Source/WebCore/dom/Element.cpp	2011-11-23 10:35:16 UTC (rev 101060)
+++ trunk/Source/WebCore/dom/Element.cpp	2011-11-23 10:46:04 UTC (rev 101061)
@@ -617,45 +617,11 @@
 }
 
 #if ENABLE(MUTATION_OBSERVERS)
-static inline bool hasOldValue(MutationObserverOptions options)
+static void enqueueAttributesMutationRecord(Element* target, const QualifiedName& attributeName, const AtomicString& oldValue)
 {
-    return options & WebKitMutationObserver::AttributeOldValue;
+    OwnPtr<MutationObserverInterestGroup> mutationRecipients = MutationObserverInterestGroup::createForAttributesMutation(target, attributeName.localName());
+    mutationRecipients->enqueueMutationRecord(MutationRecord::createAttributes(target, attributeName, oldValue));
 }
-
-static inline bool isOldValueRequested(const HashMap<WebKitMutationObserver*, MutationObserverOptions>& observers)
-{
-    for (HashMap<WebKitMutationObserver*, MutationObserverOptions>::const_iterator iter = observers.begin(); iter != observers.end(); ++iter) {
-        if (hasOldValue(iter->second))
-            return true;
-    }
-    return false;
-}
-
-static void enqueueAttributesMutationRecord(Element* element, const QualifiedName& name, const AtomicString& oldValue)
-{
-    HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions> observers;
-    element->getRegisteredMutationObserversOfType(observers, WebKitMutationObserver::Attributes, name.localName());
-    if (observers.isEmpty())
-        return;
-
-    // FIXME: Factor this logic out to avoid duplication with characterDataOldValue.
-    RefPtr<MutationRecord> mutation = MutationRecord::createAttributes(element, name, isOldValueRequested(observers) ? oldValue : nullAtom);
-    RefPtr<MutationRecord> mutationWithNullOldValue;
-    for (HashMap<WebKitMutationObserver*, MutationObserverOptions>::iterator iter = observers.begin(); iter != observers.end(); ++iter) {
-        WebKitMutationObserver* observer = iter->first;
-        if (hasOldValue(iter->second)) {
-            observer->enqueueMutationRecord(mutation);
-            continue;
-        }
-        if (!mutationWithNullOldValue) {
-            if (mutation->oldValue().isNull())
-                mutationWithNullOldValue = mutation;
-            else
-                mutationWithNullOldValue = MutationRecord::createWithNullOldValue(mutation).get();
-        }
-        observer->enqueueMutationRecord(mutationWithNullOldValue);
-    }
-}
 #endif
 
 void Element::setAttribute(const AtomicString& name, const AtomicString& value, ExceptionCode& ec)

Modified: trunk/Source/WebCore/dom/WebKitMutationObserver.cpp (101060 => 101061)


--- trunk/Source/WebCore/dom/WebKitMutationObserver.cpp	2011-11-23 10:35:16 UTC (rev 101060)
+++ trunk/Source/WebCore/dom/WebKitMutationObserver.cpp	2011-11-23 10:46:04 UTC (rev 101061)
@@ -141,6 +141,62 @@
     }
 }
 
+PassOwnPtr<MutationObserverInterestGroup> MutationObserverInterestGroup::createForChildListMutation(Node* target)
+{
+    return adoptPtr(new MutationObserverInterestGroup(target, WebKitMutationObserver::ChildList));
+}
+
+PassOwnPtr<MutationObserverInterestGroup> MutationObserverInterestGroup::createForCharacterDataMutation(Node* target)
+{
+    return adoptPtr(new MutationObserverInterestGroup(target, WebKitMutationObserver::CharacterData));
+}
+
+PassOwnPtr<MutationObserverInterestGroup> MutationObserverInterestGroup::createForAttributesMutation(Node* target, const AtomicString& attributeName)
+{
+    return adoptPtr(new MutationObserverInterestGroup(target, WebKitMutationObserver::Attributes, attributeName));
+}
+
+MutationObserverInterestGroup::MutationObserverInterestGroup(Node* target, WebKitMutationObserver::MutationType type, const AtomicString& attributeName)
+{
+    target->getRegisteredMutationObserversOfType(m_observers, type, attributeName);
+    if (type & WebKitMutationObserver::Attributes)
+        m_oldValueFlag = WebKitMutationObserver::AttributeOldValue;
+    else if (type & WebKitMutationObserver::CharacterData)
+        m_oldValueFlag = WebKitMutationObserver::CharacterDataOldValue;
+}
+
+bool MutationObserverInterestGroup::isOldValueRequested()
+{
+    for (HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter) {
+        if (hasOldValue(iter->second))
+            return true;
+    }
+    return false;
+}
+
+void MutationObserverInterestGroup::enqueueMutationRecord(PassRefPtr<MutationRecord> prpMutation)
+{
+    if (m_observers.isEmpty())
+        return;
+
+    RefPtr<MutationRecord> mutation = prpMutation;
+    RefPtr<MutationRecord> mutationWithNullOldValue;
+    for (HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter) {
+        WebKitMutationObserver* observer = iter->first;
+        if (hasOldValue(iter->second)) {
+            observer->enqueueMutationRecord(mutation);
+            continue;
+        }
+        if (!mutationWithNullOldValue) {
+            if (mutation->oldValue().isNull())
+                mutationWithNullOldValue = mutation;
+            else
+                mutationWithNullOldValue = MutationRecord::createWithNullOldValue(mutation).get();
+        }
+        observer->enqueueMutationRecord(mutationWithNullOldValue);
+    }
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MUTATION_OBSERVERS)

Modified: trunk/Source/WebCore/dom/WebKitMutationObserver.h (101060 => 101061)


--- trunk/Source/WebCore/dom/WebKitMutationObserver.h	2011-11-23 10:35:16 UTC (rev 101060)
+++ trunk/Source/WebCore/dom/WebKitMutationObserver.h	2011-11-23 10:46:04 UTC (rev 101061)
@@ -33,6 +33,7 @@
 
 #if ENABLE(MUTATION_OBSERVERS)
 
+#include <wtf/HashMap.h>
 #include <wtf/HashSet.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
@@ -94,6 +95,24 @@
     HashSet<MutationObserverRegistration*> m_registrations;
 };
 
+class MutationObserverInterestGroup {
+public:
+    static PassOwnPtr<MutationObserverInterestGroup> createForChildListMutation(Node* target);
+    static PassOwnPtr<MutationObserverInterestGroup> createForCharacterDataMutation(Node* target);
+    static PassOwnPtr<MutationObserverInterestGroup> createForAttributesMutation(Node* target, const AtomicString& attributeName);
+
+    bool isOldValueRequested();
+    bool isEmpty() { return m_observers.isEmpty(); }
+    void enqueueMutationRecord(PassRefPtr<MutationRecord>);
+private:
+    MutationObserverInterestGroup(Node* target, WebKitMutationObserver::MutationType, const AtomicString& attributeName = nullAtom);
+
+    inline bool hasOldValue(MutationRecordDeliveryOptions options) { return options & m_oldValueFlag; }
+
+    HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions> m_observers;
+    WebKitMutationObserver::DeliveryFlags m_oldValueFlag;
+};
+
 }
 
 #endif // ENABLE(MUTATION_OBSERVERS)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to