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)