Index: Source/bindings/v8/ScriptPromiseResolverWithContext.cpp |
diff --git a/Source/bindings/v8/ScriptPromiseResolverWithContext.cpp b/Source/bindings/v8/ScriptPromiseResolverWithContext.cpp |
index 1a39cac07223f4c777f9d4df80e891041609d0fa..bc4ba6d7da416643bf6a74480b35d8dd22e56db2 100644 |
--- a/Source/bindings/v8/ScriptPromiseResolverWithContext.cpp |
+++ b/Source/bindings/v8/ScriptPromiseResolverWithContext.cpp |
@@ -9,6 +9,10 @@ |
namespace WebCore { |
+namespace { |
+const char hiddenPropertyName[] = "blink::keepObjectWhilePending"; |
+} // namespace |
+ |
ScriptPromiseResolverWithContext::ScriptPromiseResolverWithContext(ScriptState* scriptState) |
: ActiveDOMObject(scriptState->executionContext()) |
, m_state(Pending) |
@@ -18,6 +22,16 @@ ScriptPromiseResolverWithContext::ScriptPromiseResolverWithContext(ScriptState* |
{ |
} |
+ScriptPromiseResolverWithContext::~ScriptPromiseResolverWithContext() |
+{ |
+ if (m_state != ResolvedOrRejected) { |
+ unregisterKeptObject(); |
+ ScriptState::Scope scope(m_scriptState.get()); |
+ reject(v8::Exception::Error(v8::String::NewFromUtf8(m_scriptState->isolate(), |
+ "ScriptPromiseResolverWithContext is destructed without resolve / reject"))); |
+ } |
+} |
+ |
void ScriptPromiseResolverWithContext::suspend() |
{ |
m_timer.stop(); |
@@ -63,6 +77,7 @@ void ScriptPromiseResolverWithContext::resolveOrRejectImmediately() |
void ScriptPromiseResolverWithContext::clear() |
{ |
+ unregisterKeptObject(); |
ResolutionState state = m_state; |
m_state = ResolvedOrRejected; |
m_resolver.clear(); |
@@ -74,4 +89,31 @@ void ScriptPromiseResolverWithContext::clear() |
// |this| may be deleted here. |
} |
+void ScriptPromiseResolverWithContext::keepObjectWhilePendingInternal(v8::Handle<v8::Value> value) |
+{ |
+ v8::HandleScope handleScope(m_scriptState->isolate()); |
+ if (!m_resolver) |
+ return; |
+ ScriptPromise promise = this->promise(); |
+ if (promise.isEmpty()) |
+ return; |
+ v8::Local<v8::Promise> v8Promise = promise.v8Value().As<v8::Promise>(); |
+ v8::Local<v8::String> name = v8::String::NewFromUtf8(m_scriptState->isolate(), hiddenPropertyName); |
+ ASSERT(v8Promise->GetHiddenValue(name).IsEmpty()); |
+ v8Promise->SetHiddenValue(name, value); |
haraken
2014/06/13 05:03:51
Consider using helper methods in V8HiddenValue.h i
yhirano
2014/06/13 11:15:22
Done.
|
+} |
+ |
+void ScriptPromiseResolverWithContext::unregisterKeptObject() |
+{ |
+ v8::HandleScope handleScope(m_scriptState->isolate()); |
+ if (!m_resolver) |
+ return; |
+ ScriptPromise promise = this->promise(); |
+ if (promise.isEmpty()) |
+ return; |
+ v8::Local<v8::Promise> v8Promise = promise.v8Value().As<v8::Promise>(); |
+ v8::Local<v8::String> name = v8::String::NewFromUtf8(m_scriptState->isolate(), hiddenPropertyName); |
+ v8Promise->DeleteHiddenValue(name); |
yhirano
2014/06/12 11:02:51
Rafael, I heard that deleting a property is genera
rafaelw
2014/06/13 02:36:17
Haraken is probably more authoritative on this tha
haraken
2014/06/13 03:36:53
Agreed, I don't think deleting a hidden property a
yhirano
2014/06/13 04:19:30
Then is it better to have another boolean member v
yhirano
2014/06/13 04:19:30
Thanks!
haraken
2014/06/13 05:03:51
Only if this code is really performance-sensitive
|
+} |
+ |
} // namespace WebCore |