Index: third_party/WebKit/Source/core/dom/TreeScope.cpp |
diff --git a/third_party/WebKit/Source/core/dom/TreeScope.cpp b/third_party/WebKit/Source/core/dom/TreeScope.cpp |
index fe8f2ff9f4158bc2e2c17573f1389aacf4d19d1b..b1ef5db78976946ad332ccee02eac84547b269e1 100644 |
--- a/third_party/WebKit/Source/core/dom/TreeScope.cpp |
+++ b/third_party/WebKit/Source/core/dom/TreeScope.cpp |
@@ -186,11 +186,44 @@ void TreeScope::addElementById(const AtomicString& elementId, Element* element) |
m_idTargetObserverRegistry->notifyObservers(elementId); |
} |
+ |
+#if ENABLE(ASSERT) |
+namespace { |
+ |
+class RemovingElementIdScope { |
+ STACK_ALLOCATED(); |
+public: |
+ RemovingElementIdScope(DocumentOrderedMap& elementsById, const AtomicString& id) |
+ : m_elementsById(&elementsById) |
+ { |
+ m_elementsById->willRemoveId(id); |
+ } |
+ ~RemovingElementIdScope() |
+ { |
+ m_elementsById->willRemoveId(nullAtom); |
+ } |
+ |
+private: |
+ RawPtrWillBeMember<DocumentOrderedMap> m_elementsById; |
+}; |
+ |
+} |
+#endif |
+ |
void TreeScope::removeElementById(const AtomicString& elementId, Element* element) |
{ |
if (!m_elementsById) |
return; |
m_elementsById->remove(elementId, element); |
+#if ENABLE(ASSERT) |
+ // Register 'elementId' as being removed. This is done should observers |
+ // attempt to also look it up, something that the underlying DocumentOrderedMap |
+ // is incapable of answering precisely while an element (and its |
+ // children) are being removed from the tree. This is _only_ done to avoid |
+ // an assert in DocumentOrderedMap::get() from falsely triggering for such |
+ // unusual and unexpected lookups. |
+ RemovingElementIdScope removalScope(*m_elementsById, elementId); |
+#endif |
m_idTargetObserverRegistry->notifyObservers(elementId); |
} |