void ScriptPromisePropertyBase::clearWrappers() { v8::HandleScope handleScope(m_isolate); for (WeakPersistentSet::iterator i = m_wrappers.begin(); i != m_wrappers.end(); ++i) { v8::Local<v8::Object> wrapper = (*i)->newLocal(m_isolate); if (!wrapper.IsEmpty()) { wrapper->DeleteHiddenValue(resolverName()); wrapper->DeleteHiddenValue(promiseName()); } } m_wrappers.clear(); }
void ScriptPromisePropertyBase::clearWrappers() { checkThis(); checkWrappers(); v8::HandleScope handleScope(m_isolate); for (WeakPersistentSet::iterator i = m_wrappers.begin(); i != m_wrappers.end(); ++i) { v8::Local<v8::Object> wrapper = (*i)->newLocal(m_isolate); if (!wrapper.IsEmpty()) { ScriptState* scriptState = ScriptState::from(wrapper->CreationContext()); V8HiddenValue::deleteHiddenValue(scriptState, wrapper, resolverName()); V8HiddenValue::deleteHiddenValue(scriptState, wrapper, promiseName()); } } m_wrappers.clear(); }
ScriptPromise ScriptPromisePropertyBase::promise(DOMWrapperWorld& world) { if (!getExecutionContext()) return ScriptPromise(); v8::HandleScope handleScope(m_isolate); v8::Local<v8::Context> context = toV8Context(getExecutionContext(), world); if (context.IsEmpty()) return ScriptPromise(); ScriptState* scriptState = ScriptState::from(context); ScriptState::Scope scope(scriptState); v8::Local<v8::Object> wrapper = ensureHolderWrapper(scriptState); ASSERT(wrapper->CreationContext() == context); v8::Local<v8::Value> cachedPromise = V8HiddenValue::getHiddenValue(scriptState, wrapper, promiseName()); if (!cachedPromise.IsEmpty() && cachedPromise->IsPromise()) return ScriptPromise(scriptState, cachedPromise); // Create and cache the Promise v8::Local<v8::Promise::Resolver> resolver; if (!v8::Promise::Resolver::New(context).ToLocal(&resolver)) return ScriptPromise(); v8::Local<v8::Promise> promise = resolver->GetPromise(); V8HiddenValue::setHiddenValue(scriptState, wrapper, promiseName(), promise); switch (m_state) { case Pending: // Cache the resolver too V8HiddenValue::setHiddenValue(scriptState, wrapper, resolverName(), resolver); break; case Resolved: case Rejected: resolveOrRejectInternal(resolver); break; } return ScriptPromise(scriptState, promise); }