Changeset 138754 in webkit
- Timestamp:
- Jan 3, 2013, 3:22:44 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r138751 r138754 1 2013-01-03 Rafael Weinstein <rafaelw@chromium.org> 2 3 [Mutation Observers] prevent delivery while recipient context is suspended 4 https://bugs.webkit.org/show_bug.cgi?id=105810 5 6 Reviewed by Adam Barth. 7 8 * inspector/debugger/mutation-observer-suspend-while-paused-expected.txt: Added. 9 * inspector/debugger/mutation-observer-suspend-while-paused.html: Added. 10 1 11 2013-01-03 Csaba Osztrogonác <ossy@webkit.org> 2 12 -
trunk/Source/WebCore/ChangeLog
r138747 r138754 1 2013-01-03 Rafael Weinstein <rafaelw@chromium.org> 2 3 [Mutation Observers] prevent delivery while recipient context is suspended 4 https://bugs.webkit.org/show_bug.cgi?id=105810 5 6 Reviewed by Adam Barth. 7 8 Test: inspector/debugger/mutation-observer-suspend-while-paused.html 9 10 * dom/MutationObserver.cpp: 11 (WebCore::suspendedMutationObservers): 12 (WebCore): 13 (WebCore::MutationObserver::canDeliver): 14 (WebCore::MutationObserver::deliver): 15 (WebCore::MutationObserver::deliverAllMutations): 16 * dom/MutationObserver.h: 17 1 18 2013-01-03 Dan Bernstein <mitz@apple.com> 2 19 -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r138138 r138754 2830 2830 push(@headerContent, " }\n\n"); 2831 2831 2832 # ScriptExecutionContext 2833 push(@headerContent, " virtual ScriptExecutionContext* scriptExecutionContext() const { return ContextDestructionObserver::scriptExecutionContext(); }\n\n"); 2834 2832 2835 # Destructor 2833 2836 push(@headerContent, " virtual ~$className();\n"); -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm
r138725 r138754 3287 3287 3288 3288 push(@headerContent, <<END); 3289 3290 virtual ScriptExecutionContext* scriptExecutionContext() const { return ContextDestructionObserver::scriptExecutionContext(); } 3289 3291 3290 3292 private: -
trunk/Source/WebCore/dom/MutationCallback.h
r122159 r138754 50 50 51 51 virtual bool handleEvent(MutationRecordArray*, MutationObserver*) = 0; 52 virtual ScriptExecutionContext* scriptExecutionContext() const = 0; 52 53 }; 53 54 -
trunk/Source/WebCore/dom/MutationObserver.cpp
r135228 r138754 155 155 } 156 156 157 static MutationObserverSet& suspendedMutationObservers() 158 { 159 DEFINE_STATIC_LOCAL(MutationObserverSet, suspendedObservers, ()); 160 return suspendedObservers; 161 } 162 157 163 void MutationObserver::enqueueMutationRecord(PassRefPtr<MutationRecord> mutation) 158 164 { … … 176 182 } 177 183 184 bool MutationObserver::canDeliver() 185 { 186 return !m_callback->scriptExecutionContext()->activeDOMObjectsAreSuspended(); 187 } 188 178 189 void MutationObserver::deliver() 179 190 { 191 ASSERT(canDeliver()); 192 180 193 // Calling clearTransientRegistrations() can modify m_registrations, so it's necessary 181 194 // to make a copy of the transient registrations before operating on them. … … 205 218 deliveryInProgress = true; 206 219 220 if (!suspendedMutationObservers().isEmpty()) { 221 Vector<RefPtr<MutationObserver> > suspended; 222 copyToVector(suspendedMutationObservers(), suspended); 223 for (size_t i = 0; i < suspended.size(); ++i) { 224 if (!suspended[i]->canDeliver()) 225 continue; 226 227 suspendedMutationObservers().remove(suspended[i]); 228 activeMutationObservers().add(suspended[i]); 229 } 230 } 231 207 232 while (!activeMutationObservers().isEmpty()) { 208 233 Vector<RefPtr<MutationObserver> > observers; … … 210 235 activeMutationObservers().clear(); 211 236 std::sort(observers.begin(), observers.end(), ObserverLessThan()); 212 for (size_t i = 0; i < observers.size(); ++i) 213 observers[i]->deliver(); 237 for (size_t i = 0; i < observers.size(); ++i) { 238 if (observers[i]->canDeliver()) 239 observers[i]->deliver(); 240 else 241 suspendedMutationObservers().add(observers[i]); 242 } 214 243 } 215 244 -
trunk/Source/WebCore/dom/MutationObserver.h
r135228 r138754 87 87 void enqueueMutationRecord(PassRefPtr<MutationRecord>); 88 88 void setHasTransientRegistration(); 89 bool canDeliver(); 89 90 90 91 HashSet<Node*> getObservedNodes() const;
Note:
See TracChangeset
for help on using the changeset viewer.