Index: third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp b/third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp |
index 0555700c15faa1556e0d996ca38546046b6ae55f..389756e6f31c8b9fc6c3dfe3dbbadb506d87786e 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp |
@@ -30,6 +30,7 @@ |
#include "bindings/core/v8/V8GCController.h" |
+#include "bindings/core/v8/ActiveScriptWrappable.h" |
#include "bindings/core/v8/NPV8Object.h" |
#include "bindings/core/v8/RetainedDOMInfo.h" |
#include "bindings/core/v8/V8AbstractEventListener.h" |
@@ -119,7 +120,7 @@ public: |
v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8::Persistent<v8::Object>::Cast(*value)); |
ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); |
const WrapperTypeInfo* type = toWrapperTypeInfo(wrapper); |
- if (type != npObjectTypeInfo() && toScriptWrappable(wrapper)->hasPendingActivity()) { |
+ if (type != npObjectTypeInfo() && type->hasPendingActivity(wrapper)) { |
v8::Persistent<v8::Object>::Cast(*value).MarkActive(); |
return; |
} |
@@ -164,7 +165,7 @@ public: |
ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); |
const WrapperTypeInfo* type = toWrapperTypeInfo(wrapper); |
- if (type != npObjectTypeInfo() && toScriptWrappable(wrapper)->hasPendingActivity()) { |
+ if (type != npObjectTypeInfo() && type->hasPendingActivity(wrapper)) { |
// If you hit this assert, you'll need to add a [DependentiLifetime] |
// extended attribute to the DOM interface. A DOM interface that |
// overrides hasPendingActivity must be marked as [DependentiLifetime]. |
@@ -436,8 +437,9 @@ void V8GCController::traceDOMWrappers(v8::Isolate* isolate, Visitor* visitor) |
class PendingActivityVisitor : public v8::PersistentHandleVisitor { |
public: |
- explicit PendingActivityVisitor(ExecutionContext* executionContext) |
- : m_executionContext(executionContext) |
+ PendingActivityVisitor(v8::Isolate* isolate, ExecutionContext* executionContext) |
+ : m_isolate(isolate) |
+ , m_executionContext(executionContext) |
, m_pendingActivityFound(false) |
{ |
} |
@@ -452,11 +454,12 @@ public: |
if (classId != WrapperTypeInfo::NodeClassId && classId != WrapperTypeInfo::ObjectClassId) |
return; |
- const v8::Persistent<v8::Object>& wrapper = v8::Persistent<v8::Object>::Cast(*value); |
+ v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8::Persistent<v8::Object>::Cast(*value)); |
+ ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); |
const WrapperTypeInfo* type = toWrapperTypeInfo(wrapper); |
// The ExecutionContext check is heavy, so it should be done at the last. |
if (type != npObjectTypeInfo() |
- && toScriptWrappable(wrapper)->hasPendingActivity() |
+ && type->hasPendingActivity(wrapper) |
// TODO(haraken): Currently we don't have a way to get a creation |
// context from a wrapper. We should implement the way and enable |
// the following condition. |
@@ -476,11 +479,12 @@ public: |
bool pendingActivityFound() const { return m_pendingActivityFound; } |
private: |
+ v8::Isolate* m_isolate; |
RawPtrWillBePersistent<ExecutionContext> m_executionContext; |
bool m_pendingActivityFound; |
}; |
-bool V8GCController::hasPendingActivity(ExecutionContext* executionContext) |
+bool V8GCController::hasPendingActivity(v8::Isolate* isolate, ExecutionContext* executionContext) |
{ |
// V8GCController::hasPendingActivity is used only when a worker checks if |
// the worker contains any wrapper that has pending activities. |
@@ -488,7 +492,8 @@ bool V8GCController::hasPendingActivity(ExecutionContext* executionContext) |
DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, scanPendingActivityHistogram, new CustomCountHistogram("Blink.ScanPendingActivityDuration", 1, 1000, 50)); |
double startTime = WTF::currentTimeMS(); |
- PendingActivityVisitor visitor(executionContext); |
+ v8::HandleScope scope(isolate); |
+ PendingActivityVisitor visitor(isolate, executionContext); |
toIsolate(executionContext)->VisitHandlesWithClassIds(&visitor); |
scanPendingActivityHistogram.count(static_cast<int>(WTF::currentTimeMS() - startTime)); |
return visitor.pendingActivityFound(); |