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

Side by Side Diff: sky/engine/bindings-dart/core/dart/DartGCController.cpp

Issue 918273002: Remove bindings-dart (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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 unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include "config.h"
31 #include "bindings/core/dart/DartGCController.h"
32
33 #include "core/HTMLNames.h"
34 #include "bindings/core/dart/DartDOMData.h"
35 #include "bindings/core/dart/DartDOMWrapper.h"
36 #include "bindings/core/dart/DartEventListener.h"
37 #include "bindings/core/dart/DartUtilities.h"
38 #include "core/dom/ActiveDOMObject.h"
39 #include "core/dom/Attr.h"
40 #include "core/dom/Document.h"
41 #include "core/dom/Node.h"
42 #include "core/frame/LocalDOMWindow.h"
43 #include "core/html/HTMLImageElement.h"
44
45 #include <wtf/Vector.h>
46
47 namespace blink {
48
49 typedef HashMap<Node*, Dart_WeakReferenceSet> WeakReferenceSetForRootMap;
50
51 static Node* calculateRootNode(Node*);
52 static void collectEventListenerWrappers(EventTarget*, Dart_WeakReferenceSet);
53
54 static void createWeakReferenceSetForNode(
55 DartDOMData* domData,
56 Dart_WeakReferenceSetBuilder setBuilder,
57 Node* node,
58 Dart_WeakPersistentHandle wrapper,
59 WeakReferenceSetForRootMap* weakReferenceSetForRootMap)
60 {
61 Dart_WeakReferenceSet weakReferenceSet = 0;
62 ASSERT(node);
63
64 Node* root = 0;
65 if (node->inDocument() || (node->hasTagName(HTMLNames::imgTag) && static_cas t<HTMLImageElement*>(node)->hasPendingActivity())) {
66 root = &node->document();
67 } else {
68 root = calculateRootNode(node);
69 if (!root)
70 return;
71 }
72 ASSERT(root);
73
74 Document* document = static_cast<Document*>(domData->scriptExecutionContext( ));
75 if (root == document) {
76 weakReferenceSet = domData->documentWeakReferenceSet();
77 Dart_AppendToWeakReferenceSet(weakReferenceSet, wrapper, wrapper);
78 } else {
79 WeakReferenceSetForRootMap::const_iterator weakReferenceSetIterator = we akReferenceSetForRootMap->find(root);
80 if (weakReferenceSetIterator != weakReferenceSetForRootMap->end()) {
81 weakReferenceSet = weakReferenceSetIterator->value;
82 Dart_AppendToWeakReferenceSet(weakReferenceSet, wrapper, wrapper);
83 }
84 else {
85 weakReferenceSet = Dart_NewWeakReferenceSet(setBuilder, wrapper, wra pper);
86 weakReferenceSetForRootMap->set(root, weakReferenceSet);
87 }
88 }
89 EventTarget* eventTarget = node;
90 if (eventTarget->hasEventListeners())
91 collectEventListenerWrappers(node, weakReferenceSet);
92 }
93
94 static void collectRetainedActiveDOMObjectWrappers(DartDOMData* domData, Dart_We akReferenceSet set)
95 {
96 DartMessagePortMap* messagePortMap = domData->messagePortMap();
97 for (DartMessagePortMap::const_iterator it = messagePortMap->begin(); it != messagePortMap->end(); ++it) {
98 MessagePort* messagePort = it->key;
99 if (messagePort->isEntangled() || messagePort->hasPendingActivity()) {
100 Dart_AppendValueToWeakReferenceSet(set, it->value);
101 }
102 }
103 }
104
105 static Node* calculateRootNode(Node* node)
106 {
107 Node* root = node;
108 if (node->isAttributeNode()) {
109 root = static_cast<Attr*>(node)->ownerElement();
110 // If the attribute has no element, no need to put it in the group,
111 // because it'll always be a group of 1.
112 if (!root)
113 return 0;
114 } else {
115 while (Node* parent = root->parentOrShadowHostOrTemplateHostNode())
116 root = parent;
117 }
118 return root;
119 }
120
121 static void collectEventListenerWrappers(EventTarget* eventTarget, Dart_WeakRefe renceSet weakReferenceSet)
122 {
123 EventListenerIterator iterator(eventTarget);
124 while (EventListener* listener = iterator.nextListener()) {
125 if (static_cast<int>(listener->type()) != DartEventListenerType)
126 continue;
127 DartEventListener* dartListener = static_cast<DartEventListener*>(listen er);
128 if (dartListener->isolate() != Dart_CurrentIsolate())
129 continue;
130 Dart_AppendValueToWeakReferenceSet(weakReferenceSet, dartListener->liste nerObject());
131 }
132 }
133
134 void DartGCController::prologueCallback()
135 {
136 Dart_EnterScope();
137
138 DartDOMData* domData = DartDOMData::current();
139 ASSERT(domData->isDOMEnabled());
140 ASSERT(domData->reachableWeakHandle());
141
142 // Setup weak reference set builder.
143 Dart_WeakReferenceSetBuilder setBuilder = Dart_NewWeakReferenceSetBuilder();
144 ASSERT(setBuilder);
145 domData->setWeakReferenceSetBuilder(setBuilder);
146
147 // Setup root <=> weak_reference_set map.
148 WeakReferenceSetForRootMap weakReferenceSetForRootMap;
149 domData->setWeakReferenceSetForRootMap(&weakReferenceSetForRootMap);
150
151 // Create dedicated weak reference set for a document.
152 // ActiveDOMObjects with pending activity and active Message ports
153 // will be added to this set.
154 ASSERT(domData->scriptExecutionContext()->isDocument());
155 Document* document = static_cast<Document*>(domData->scriptExecutionContext( ));
156 Dart_WeakReferenceSet documentWeakReferenceSet =
157 Dart_NewWeakReferenceSet(setBuilder, domData->reachableWeakHandle(), 0);
158 domData->setDocumentWeakReferenceSet(documentWeakReferenceSet);
159 weakReferenceSetForRootMap.set(document, documentWeakReferenceSet);
160
161 // Now visit all the prolog weak handles.
162 Dart_Handle ALLOW_UNUSED result = Dart_VisitPrologueWeakHandles(prologueWeak HandleCallback);
163 collectRetainedActiveDOMObjectWrappers(domData, documentWeakReferenceSet);
164 }
165
166 void DartGCController::epilogueCallback()
167 {
168 Dart_ExitScope();
169 }
170
171 void DartGCController::prologueWeakHandleCallback(void* isolateCallbackData, Dar t_WeakPersistentHandle obj, intptr_t numNativeFields, intptr_t* nativeFields)
172 {
173 if (!numNativeFields)
174 return;
175 ASSERT(numNativeFields == DartDOMWrapper::NativeFieldCount);
176
177 DartDOMData* domData = reinterpret_cast<DartDOMData*>(isolateCallbackData);
178 ASSERT(domData->isDOMEnabled());
179
180 intptr_t cid = nativeFields[DartDOMWrapper::NativeTypeIndex];
181 void* nativeObject = reinterpret_cast<void*>(nativeFields[DartDOMWrapper::Na tiveImplementationIndex]);
182 const DartWrapperTypeInfo& typeInfo = DartWebkitClassInfo[cid];
183 ASSERT(typeInfo.toNode);
184 Node* node = typeInfo.toNode(nativeObject);
185 if (node) {
186 Dart_WeakReferenceSetBuilder setBuilder = domData->weakReferenceSetBuild er();
187 WeakReferenceSetForRootMap* weakReferenceSetForRootMap = domData->weakRe ferenceSetForRootMap();
188 createWeakReferenceSetForNode(domData, setBuilder, node, obj, weakRefere nceSetForRootMap);
189 return;
190 }
191 ASSERT(typeInfo.toEventTarget);
192 EventTarget* eventTarget = typeInfo.toEventTarget(nativeObject);
193 if (eventTarget) {
194 if (eventTarget->hasEventListeners()) {
195 Dart_WeakReferenceSetBuilder setBuilder = domData->weakReferenceSetB uilder();
196 Dart_WeakReferenceSet set = Dart_NewWeakReferenceSet(setBuilder, obj , 0);
197
198 collectEventListenerWrappers(eventTarget, set);
199 }
200 }
201 ASSERT(typeInfo.toActiveDOMObject);
202 ActiveDOMObject* activeDOMObject = typeInfo.toActiveDOMObject(nativeObject);
203 if (activeDOMObject && activeDOMObject->hasPendingActivity()) {
204 Dart_WeakReferenceSet documentWeakReferenceSet = domData->documentWeakRe ferenceSet();
205 Dart_AppendValueToWeakReferenceSet(documentWeakReferenceSet, obj);
206 }
207 }
208
209 }
OLDNEW
« no previous file with comments | « sky/engine/bindings-dart/core/dart/DartGCController.h ('k') | sky/engine/bindings-dart/core/dart/DartHandleProxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698