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

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
« no previous file with comments | « Source/WebCore/bindings/dart/DartDOMWrapper.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..920a297c8fe5474d360d8280e49198aae4d0609d 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*);
+static void collectEventListenerWrappers(EventTarget*, Vector<Dart_Handle>& wrappers);
-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);
@@ -99,15 +90,29 @@ void DartGCController::prologueCallback()
Dart_Handle wrapper = it->second;
weakReferenceSet->keys.append(wrapper);
weakReferenceSet->values.append(wrapper);
- addEventListenersToReferenceSet(node, weakReferenceSet);
+ collectEventListenerWrappers(node, weakReferenceSet->values);
}
+}
+static void createWeakReferenceSetsForEventTargets(DartDOMData* domData, WeakReferenceSets* weakReferenceSets)
+{
+ 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);
+ collectEventListenerWrappers(it->first, weakReferenceSet->values);
+ }
+}
+
+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 +121,9 @@ 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()
-{
- WTF::deleteAllValues(*weakReferenceSetForRoot());
- weakReferenceSetForRoot()->clear();
}
static Node* calculateRootNode(Node* node)
@@ -150,7 +142,7 @@ static Node* calculateRootNode(Node* node)
return root;
}
-static void addEventListenersToReferenceSet(EventTarget* eventTarget, WeakReferenceSet* weakReferenceSet)
+static void collectEventListenerWrappers(EventTarget* eventTarget, Vector<Dart_Handle>& wrappers)
{
if (!eventTarget->hasEventListeners())
return;
@@ -162,8 +154,35 @@ static void addEventListenersToReferenceSet(EventTarget* eventTarget, WeakRefere
DartEventListener* dartListener = static_cast<DartEventListener*>(listener);
if (dartListener->isolate() != DartIsolate::current())
continue;
- weakReferenceSet->values.append(dartListener->listenerObject());
+ wrappers.append(dartListener->listenerObject());
+ }
+}
+
+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();
+}
+
}
« no previous file with comments | « Source/WebCore/bindings/dart/DartDOMWrapper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698