MutationObserverInterestGroup.cpp [plain text]
#include "config.h"
#if ENABLE(MUTATION_OBSERVERS)
#include "MutationObserverInterestGroup.h"
#include "MutationObserverRegistration.h"
#include "MutationRecord.h"
#include "Node.h"
#include "QualifiedName.h"
namespace WebCore {
PassOwnPtr<MutationObserverInterestGroup> MutationObserverInterestGroup::createIfNeeded(Node* target, WebKitMutationObserver::MutationType type, MutationRecordDeliveryOptions oldValueFlag, const QualifiedName* attributeName)
{
ASSERT((type == WebKitMutationObserver::Attributes && attributeName) || !attributeName);
HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions> observers;
target->getRegisteredMutationObserversOfType(observers, type, attributeName);
if (observers.isEmpty())
return nullptr;
return adoptPtr(new MutationObserverInterestGroup(observers, oldValueFlag));
}
MutationObserverInterestGroup::MutationObserverInterestGroup(HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions>& observers, MutationRecordDeliveryOptions oldValueFlag)
: m_oldValueFlag(oldValueFlag)
{
ASSERT(!observers.isEmpty());
m_observers.swap(observers);
}
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)
{
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);
}
}
}
#endif // ENABLE(MUTATION_OBSERVERS)