Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 return; | 126 return; |
| 127 | 127 |
| 128 v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8 ::Persistent<v8::Object>::Cast(*value)); | 128 v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8 ::Persistent<v8::Object>::Cast(*value)); |
| 129 ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); | 129 ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); |
| 130 ASSERT(V8Node::hasInstance(wrapper, m_isolate)); | 130 ASSERT(V8Node::hasInstance(wrapper, m_isolate)); |
| 131 Node* node = V8Node::toImpl(wrapper); | 131 Node* node = V8Node::toImpl(wrapper); |
| 132 // A minor DOM GC can handle only node wrappers in the main world. | 132 // A minor DOM GC can handle only node wrappers in the main world. |
| 133 // Note that node->wrapper().IsEmpty() returns true for nodes that | 133 // Note that node->wrapper().IsEmpty() returns true for nodes that |
| 134 // do not have wrappers in the main world. | 134 // do not have wrappers in the main world. |
| 135 if (node->containsWrapper()) { | 135 if (node->containsWrapper()) { |
| 136 const WrapperTypeInfo* type = toWrapperTypeInfo(wrapper); | 136 ScriptWrappable* scriptwrappable = getInternalField<ScriptWrappable, v8DOMWrapperObjectIndex>(wrapper); |
| 137 ActiveDOMObject* activeDOMObject = type->toActiveDOMObject(wrapper); | 137 if (scriptwrappable && scriptwrappable->hasPendingActivity()) |
| 138 if (activeDOMObject && activeDOMObject->hasPendingActivity()) | |
| 139 return; | 138 return; |
| 140 // FIXME: Remove the special handling for image elements. | 139 // FIXME: Remove the special handling for image elements. |
| 141 // The same special handling is in V8GCController::opaqueRootForGC() . | 140 // The same special handling is in V8GCController::opaqueRootForGC() . |
| 142 // Maybe should image elements be active DOM nodes? | 141 // Maybe should image elements be active DOM nodes? |
| 143 // See https://code.google.com/p/chromium/issues/detail?id=164882 | 142 // See https://code.google.com/p/chromium/issues/detail?id=164882 |
| 144 if (isHTMLImageElement(*node) && toHTMLImageElement(*node).hasPendin gActivity()) | 143 if (isHTMLImageElement(*node) && toHTMLImageElement(*node).hasPendin gActivity()) |
| 145 return; | 144 return; |
| 146 // FIXME: Remove the special handling for SVG elements. | 145 // FIXME: Remove the special handling for SVG elements. |
| 147 // We currently can't collect SVG Elements from minor gc, as we have | 146 // We currently can't collect SVG Elements from minor gc, as we have |
| 148 // strong references from SVG property tear-offs keeping context SVG element alive. | 147 // strong references from SVG property tear-offs keeping context SVG element alive. |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 256 return; | 255 return; |
| 257 | 256 |
| 258 v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8 ::Persistent<v8::Object>::Cast(*value)); | 257 v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8 ::Persistent<v8::Object>::Cast(*value)); |
| 259 ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); | 258 ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); |
| 260 | 259 |
| 261 if (value->IsIndependent()) | 260 if (value->IsIndependent()) |
| 262 return; | 261 return; |
| 263 | 262 |
| 264 const WrapperTypeInfo* type = toWrapperTypeInfo(wrapper); | 263 const WrapperTypeInfo* type = toWrapperTypeInfo(wrapper); |
| 265 | 264 |
| 266 ActiveDOMObject* activeDOMObject = type->toActiveDOMObject(wrapper); | 265 ScriptWrappable* scriptwrappable = getInternalField<ScriptWrappable, v8D OMWrapperObjectIndex>(wrapper); |
|
haraken
2015/10/09 09:48:09
Is it guaranteed that NPObject has the internal fi
| |
| 267 if (activeDOMObject && activeDOMObject->hasPendingActivity()) { | 266 if (scriptwrappable && scriptwrappable->hasPendingActivity()) { |
| 268 m_isolate->SetObjectGroupId(*value, liveRootId()); | 267 m_isolate->SetObjectGroupId(*value, liveRootId()); |
| 269 ++m_domObjectsWithPendingActivity; | 268 ++m_domObjectsWithPendingActivity; |
| 270 } | 269 } |
| 271 | 270 |
| 272 if (classId == WrapperTypeInfo::NodeClassId) { | 271 if (classId == WrapperTypeInfo::NodeClassId) { |
| 273 ASSERT(V8Node::hasInstance(wrapper, m_isolate)); | 272 ASSERT(V8Node::hasInstance(wrapper, m_isolate)); |
| 274 Node* node = V8Node::toImpl(wrapper); | 273 Node* node = V8Node::toImpl(wrapper); |
| 275 if (node->hasEventListeners()) | 274 if (node->hasEventListeners()) |
| 276 addReferencesForNodeWithEventListeners(m_isolate, node, v8::Pers istent<v8::Object>::Cast(*value)); | 275 addReferencesForNodeWithEventListeners(m_isolate, node, v8::Pers istent<v8::Object>::Cast(*value)); |
| 277 Node* root = V8GCController::opaqueRootForGC(m_isolate, node); | 276 Node* root = V8GCController::opaqueRootForGC(m_isolate, node); |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 528 Visitor* m_visitor; | 527 Visitor* m_visitor; |
| 529 }; | 528 }; |
| 530 | 529 |
| 531 void V8GCController::traceDOMWrappers(v8::Isolate* isolate, Visitor* visitor) | 530 void V8GCController::traceDOMWrappers(v8::Isolate* isolate, Visitor* visitor) |
| 532 { | 531 { |
| 533 DOMWrapperTracer tracer(visitor); | 532 DOMWrapperTracer tracer(visitor); |
| 534 v8::V8::VisitHandlesWithClassIds(isolate, &tracer); | 533 v8::V8::VisitHandlesWithClassIds(isolate, &tracer); |
| 535 } | 534 } |
| 536 | 535 |
| 537 } // namespace blink | 536 } // namespace blink |
| OLD | NEW |