12011-11-10 Eugene Nalimov <enal@google.com>
2
3 Event listener for active DOM object that is also DOM node can be garbage collected prematurely.
4 https://bugs.webkit.org/show_bug.cgi?id=70421
5
6 Reviewed by NOBODY (OOPS!).
7
8 Problem demonstrated itself when HTMLAudioElement was changed to become active DOM object.
9 Before that there were no DOM objects that simultaneously were nodes and active objects.
10 DOM object could be held in one of 3 maps -- node map, active objects map, and all other
11 objects map, and HTMLAudioElement should be in 2 maps simultaneously. When it was in the
12 active DOM objects map only, its event listener could be garbage collected, because special
13 code that groups listeners with wrappers could handle only wrappers for objects in the node
14 map. If we put HTMLAudioElement into nodes map, it would not be active DOM node, and can be
15 garbage collected prematurely itself (see https://bugs.webkit.org/show_bug.cgi?id=66878).
16 Fix is to introduce 4th map -- active nodes map, and change the code accordingly.
17
18 Test: media/audio-garbage-collect.html
19
20 * bindings/scripts/CodeGeneratorV8.pm:
21 (GenerateNamedConstructorCallback):
22 (GetDomMapFunction):
23 * bindings/v8/DOMDataStore.cpp:
24 (WebCore::DOMDataStore::DOMDataStore):
25 (WebCore::DOMDataStore::getDOMWrapperMap):
26 (WebCore::DOMDataStore::weakNodeCallback):
27 * bindings/v8/DOMDataStore.h:
28 (WebCore::DOMDataStore::activeDomNodeMap):
29 * bindings/v8/ScopedDOMDataStore.cpp:
30 (WebCore::ScopedDOMDataStore::ScopedDOMDataStore):
31 (WebCore::ScopedDOMDataStore::~ScopedDOMDataStore):
32 * bindings/v8/StaticDOMDataStore.cpp:
33 (WebCore::StaticDOMDataStore::StaticDOMDataStore):
34 * bindings/v8/StaticDOMDataStore.h:
35 * bindings/v8/V8DOMMap.cpp:
36 (WebCore::getActiveDOMNodeMap):
37 (WebCore::removeAllDOMObjects):
38 (WebCore::visitActiveDOMNodes):
39 * bindings/v8/V8DOMMap.h:
40 * bindings/v8/V8DOMWrapper.cpp:
41 (WebCore::V8DOMWrapper::setJSWrapperForDOMNode):
42 (WebCore::V8DOMWrapper::getWrapperSlow):
43 * bindings/v8/V8GCController.cpp:
44 (WebCore::GCPrologueSpecialCase):
45 (WebCore::void):
46 (WebCore::Node):
47 (WebCore::GCPrologueVisitor::visitDOMWrapper):
48 (WebCore::V8GCController::gcPrologue):
49 (WebCore::GCEpilogueHelper::GCEpilogueSpecialCase):
50 (WebCore::GCEpilogueVisitor::visitDOMWrapper):
51 (WebCore::V8GCController::gcEpilogue):
52 * dom/Node.h:
53 (WebCore::Node::isActiveNode):
54 * html/HTMLAudioElement.h:
55 (WebCore::HTMLAudioElement::isActiveNode):
56