V8CustomIDBCallbacks.h [plain text]
#ifndef V8CustomIDBCallbacks_h
#define V8CustomIDBCallbacks_h
#include "Document.h"
#include "Frame.h"
#include "IDBDatabaseError.h"
#include "V8CustomVoidCallback.h"
#include "V8IDBDatabaseError.h"
#include "WorldContextHandle.h"
#include <v8.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#if ENABLE(INDEXED_DATABASE)
namespace WebCore {
template <typename ResultType, typename ResultWrapperType>
class V8CustomIDBCallbacks : public IDBCallbacks<ResultType> {
public:
static PassRefPtr<V8CustomIDBCallbacks> create(v8::Local<v8::Value> onSuccess, v8::Local<v8::Value> onError, ScriptExecutionContext* scriptExecutionContext)
{
return adoptRef(new V8CustomIDBCallbacks(onSuccess, onError, scriptExecutionContext));
}
virtual ~V8CustomIDBCallbacks()
{
m_onSuccess.Dispose();
m_onError.Dispose();
}
private:
V8CustomIDBCallbacks(v8::Local<v8::Value> onSuccess, v8::Local<v8::Value> onError, ScriptExecutionContext* scriptExecutionContext)
: IDBCallbacks<ResultType>(scriptExecutionContext, this)
, m_onSuccess(onSuccess->IsObject() ? v8::Persistent<v8::Object>::New(onSuccess->ToObject()) : v8::Persistent<v8::Object>())
, m_onError(onError->IsObject() ? v8::Persistent<v8::Object>::New(onError->ToObject()) : v8::Persistent<v8::Object>())
, m_worldContext(UseCurrentWorld)
{
}
template <typename Type>
void onEvent(v8::Persistent<v8::Object> callback, PassRefPtr<Type> value)
{
if (!ActiveDOMObject::scriptExecutionContext())
return;
if (callback.IsEmpty())
return;
v8::HandleScope handleScope;
v8::Handle<v8::Context> context = toV8Context(ActiveDOMObject::scriptExecutionContext(), m_worldContext);
if (context.IsEmpty())
return;
v8::Context::Scope scope(context);
v8::Handle<v8::Value> argv[] = {
toV8(value)
};
ASSERT(ActiveDOMObject::scriptExecutionContext()->isDocument());
RefPtr<Frame> protector(static_cast<Document*>(ActiveDOMObject::scriptExecutionContext())->frame());
bool callbackReturnValue = false;
invokeCallback(callback, 1, argv, callbackReturnValue);
}
virtual void onSuccessAsync(PassRefPtr<ResultType> result)
{
onEvent(m_onSuccess, ResultWrapperType::create(result));
}
virtual void onErrorAsync(PassRefPtr<IDBDatabaseError> error)
{
onEvent(m_onError, error);
}
v8::Persistent<v8::Object> m_onSuccess;
v8::Persistent<v8::Object> m_onError;
WorldContextHandle m_worldContext;
};
}
#endif
#endif // V8CustomIDBCallbacks_h