1/* 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#ifndef MutationObserver_h 32#define MutationObserver_h 33 34#include <wtf/HashMap.h> 35#include <wtf/HashSet.h> 36#include <wtf/PassRefPtr.h> 37#include <wtf/RefCounted.h> 38#include <wtf/RefPtr.h> 39#include <wtf/text/AtomicString.h> 40#include <wtf/text/AtomicStringHash.h> 41 42namespace WebCore { 43 44class Dictionary; 45class MutationCallback; 46class MutationObserverRegistration; 47class MutationRecord; 48class Node; 49 50typedef int ExceptionCode; 51 52typedef unsigned char MutationObserverOptions; 53typedef unsigned char MutationRecordDeliveryOptions; 54 55class MutationObserver : public RefCounted<MutationObserver> { 56public: 57 enum MutationType { 58 ChildList = 1 << 0, 59 Attributes = 1 << 1, 60 CharacterData = 1 << 2, 61 62 AllMutationTypes = ChildList | Attributes | CharacterData 63 }; 64 65 enum ObservationFlags { 66 Subtree = 1 << 3, 67 AttributeFilter = 1 << 4 68 }; 69 70 enum DeliveryFlags { 71 AttributeOldValue = 1 << 5, 72 CharacterDataOldValue = 1 << 6, 73 }; 74 75 static PassRefPtr<MutationObserver> create(PassRefPtr<MutationCallback>); 76 static void deliverAllMutations(); 77 78 ~MutationObserver(); 79 80 void observe(Node*, const Dictionary&, ExceptionCode&); 81 Vector<RefPtr<MutationRecord>> takeRecords(); 82 void disconnect(); 83 void observationStarted(MutationObserverRegistration*); 84 void observationEnded(MutationObserverRegistration*); 85 void enqueueMutationRecord(PassRefPtr<MutationRecord>); 86 void setHasTransientRegistration(); 87 bool canDeliver(); 88 89 HashSet<Node*> getObservedNodes() const; 90 91private: 92 struct ObserverLessThan; 93 94 explicit MutationObserver(PassRefPtr<MutationCallback>); 95 void deliver(); 96 97 static bool validateOptions(MutationObserverOptions); 98 99 RefPtr<MutationCallback> m_callback; 100 Vector<RefPtr<MutationRecord>> m_records; 101 HashSet<MutationObserverRegistration*> m_registrations; 102 unsigned m_priority; 103}; 104 105} 106 107#endif // MutationObserver_h 108