Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Unified Diff: Source/WebCore/bindings/dart/DartGCController.cpp

Issue 10745003: Properly retain non-node event listeners. (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/WebCore/bindings/dart/DartGCController.cpp
diff --git a/Source/WebCore/bindings/dart/DartGCController.cpp b/Source/WebCore/bindings/dart/DartGCController.cpp
index 5219e3222e3e12eedeee6aeb73005973e8124078..b017f3ac67c38b2692db8235005b3e18ea44ae16 100644
--- a/Source/WebCore/bindings/dart/DartGCController.cpp
+++ b/Source/WebCore/bindings/dart/DartGCController.cpp
@@ -48,31 +48,21 @@ struct WeakReferenceSet {
Vector<Dart_Handle> values;
};
-typedef HashMap<Node*, WeakReferenceSet*> weakReferenceSetForRootMap;
+typedef Vector<WeakReferenceSet*> WeakReferenceSets;
-static weakReferenceSetForRootMap* weakReferenceSetForRoot()
+static WeakReferenceSets* weakReferenceSets()
{
- DEFINE_STATIC_LOCAL(weakReferenceSetForRootMap, map, ());
- return &map;
+ DEFINE_STATIC_LOCAL(WeakReferenceSets, sets, ());
+ return &sets;
}
static Node* calculateRootNode(Node*);
static void addEventListenersToReferenceSet(EventTarget*, WeakReferenceSet*);
-void DartGCController::prologueCallback()
+static void createWeakReferenceSetsForNodes(DartDOMData* domData, WeakReferenceSet* documentWeakReferenceSet, WeakReferenceSets* weakReferenceSets)
{
- ASSERT(DartIsolate::isDOMIsolate(Dart_CurrentIsolate()));
-
- // FIXME: pass the state to epilogue callback instead of using statics.
- ASSERT(weakReferenceSetForRoot()->isEmpty());
-
- DartDOMData* domData = DartIsolate::currentDOMData();
-
- ASSERT(domData->scriptExecutionContext()->isDocument());
- Document* document = static_cast<Document*>(domData->scriptExecutionContext());
-
- WeakReferenceSet* documentWeakReferenceSet = new WeakReferenceSet;
- weakReferenceSetForRoot()->set(document, documentWeakReferenceSet);
+ typedef HashMap<Node*, WeakReferenceSet*> WeakReferenceSetForRootMap;
+ WeakReferenceSetForRootMap weakReferenceSetForRootMap;
DartDOMNodeMap* nodeMap = domData->nodeMap();
for (DartDOMNodeMap::iterator it = nodeMap->begin(); it != nodeMap->end(); ++it) {
@@ -86,12 +76,13 @@ void DartGCController::prologueCallback()
Node* root = calculateRootNode(node);
if (!root)
continue;
- weakReferenceSetForRootMap::iterator weakReferenceSetIterator = weakReferenceSetForRoot()->find(root);
- if (weakReferenceSetIterator != weakReferenceSetForRoot()->end())
+ WeakReferenceSetForRootMap::iterator weakReferenceSetIterator = weakReferenceSetForRootMap.find(root);
+ if (weakReferenceSetIterator != weakReferenceSetForRootMap.end())
weakReferenceSet = weakReferenceSetIterator->second;
else {
weakReferenceSet = new WeakReferenceSet;
- weakReferenceSetForRoot()->set(root, weakReferenceSet);
+ weakReferenceSets->append(weakReferenceSet);
+ weakReferenceSetForRootMap.set(root, weakReferenceSet);
}
}
ASSERT(weakReferenceSet);
@@ -101,13 +92,16 @@ void DartGCController::prologueCallback()
weakReferenceSet->values.append(wrapper);
addEventListenersToReferenceSet(node, weakReferenceSet);
}
+}
+static void collectRetainedActiveDOMObjectWrappers(DartDOMData* domData, Vector<Dart_Handle>& wrappers)
+{
DartActiveDOMObjectMap* activeObjectMap = domData->activeObjectMap();
for (DartActiveDOMObjectMap::iterator it = activeObjectMap->begin(); it != activeObjectMap->end(); ++it) {
ActiveDOMObject* activeDOMObject = it->first;
if (activeDOMObject->hasPendingActivity()) {
Dart_Handle wrapper = it->second;
- documentWeakReferenceSet->values.append(wrapper);
+ wrappers.append(wrapper);
}
}
@@ -116,22 +110,20 @@ void DartGCController::prologueCallback()
MessagePort* messagePort = it->first;
if (messagePort->isEntangled() || messagePort->hasPendingActivity()) {
Dart_Handle wrapper = it->second;
- documentWeakReferenceSet->values.append(wrapper);
+ wrappers.append(wrapper);
}
}
-
- addEventListenersToReferenceSet(document->domWindow(), documentWeakReferenceSet);
-
- for (weakReferenceSetForRootMap::iterator it = weakReferenceSetForRoot()->begin(); it != weakReferenceSetForRoot()->end(); ++it) {
- WeakReferenceSet* set = it->second;
- Dart_NewWeakReferenceSet(set->keys.data(), set->keys.size(), set->values.data(), set->values.size());
- }
}
-void DartGCController::epilogueCallback()
+static void createWeakReferenceSetsForEventTargets(DartDOMData* domData, WeakReferenceSets* weakReferenceSets)
{
- WTF::deleteAllValues(*weakReferenceSetForRoot());
- weakReferenceSetForRoot()->clear();
+ DartEventTargetMap* eventTargetMap = domData->eventTargetMap();
+ for (DartEventTargetMap::iterator it = eventTargetMap->begin(); it != eventTargetMap->end(); ++it) {
+ WeakReferenceSet* weakReferenceSet = new WeakReferenceSet;
+ weakReferenceSets->append(weakReferenceSet);
+ weakReferenceSet->keys.append(it->second);
+ addEventListenersToReferenceSet(it->first, weakReferenceSet);
+ }
}
static Node* calculateRootNode(Node* node)
@@ -166,4 +158,31 @@ static void addEventListenersToReferenceSet(EventTarget* eventTarget, WeakRefere
}
}
+void DartGCController::prologueCallback()
+{
+ ASSERT(DartIsolate::isDOMIsolate(Dart_CurrentIsolate()));
+ // FIXME: pass the state to epilogue callback instead of using statics.
+ ASSERT(weakReferenceSets()->isEmpty());
+
+ DartDOMData* domData = DartIsolate::currentDOMData();
+
+ WeakReferenceSet* documentWeakReferenceSet = new WeakReferenceSet;
+ weakReferenceSets()->append(documentWeakReferenceSet);
+
+ createWeakReferenceSetsForNodes(domData, documentWeakReferenceSet, weakReferenceSets());
+ createWeakReferenceSetsForEventTargets(domData, weakReferenceSets());
+ collectRetainedActiveDOMObjectWrappers(domData, documentWeakReferenceSet->values);
+
+ for (size_t i = 0; i < weakReferenceSets()->size(); ++i) {
+ WeakReferenceSet* set = (*weakReferenceSets())[i];
+ Dart_NewWeakReferenceSet(set->keys.data(), set->keys.size(), set->values.data(), set->values.size());
+ }
+}
+
+void DartGCController::epilogueCallback()
+{
+ WTF::deleteAllValues(*weakReferenceSets());
+ weakReferenceSets()->clear();
+}
+
}

Powered by Google App Engine
This is Rietveld 408576698