JSCustomSQLTransactionCallback.cpp [plain text]
#include "config.h"
#include "JSCustomSQLTransactionCallback.h"
#if ENABLE(DATABASE)
#include "Frame.h"
#include "ScriptController.h"
#include "JSSQLTransaction.h"
#include "Page.h"
#include <runtime/JSLock.h>
#include <wtf/MainThread.h>
#include <wtf/RefCountedLeakCounter.h>
namespace WebCore {
using namespace JSC;
#ifndef NDEBUG
static WTF::RefCountedLeakCounter counter("JSCustomSQLTransactionCallback");
#endif
class JSCustomSQLTransactionCallback::Data {
public:
Data(JSObject* callback, Frame* frame) : m_callback(callback), m_frame(frame) { }
JSObject* callback() { return m_callback; }
Frame* frame() { return m_frame.get(); }
private:
ProtectedPtr<JSObject> m_callback;
RefPtr<Frame> m_frame;
};
JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback(JSObject* callback, Frame* frame)
: m_data(new Data(callback, frame))
{
#ifndef NDEBUG
counter.increment();
#endif
}
void JSCustomSQLTransactionCallback::deleteData(void* context)
{
delete static_cast<Data*>(context);
}
JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback()
{
callOnMainThread(deleteData, m_data);
#ifndef NDEBUG
m_data = 0;
counter.decrement();
#endif
}
void JSCustomSQLTransactionCallback::handleEvent(SQLTransaction* transaction, bool& raisedException)
{
ASSERT(m_data);
ASSERT(m_data->callback());
ASSERT(m_data->frame());
if (!m_data->frame()->script()->isEnabled())
return;
JSGlobalObject* globalObject = m_data->frame()->script()->globalObject();
ExecState* exec = globalObject->globalExec();
JSC::JSLock lock(false);
JSValue handleEventFunction = m_data->callback()->get(exec, Identifier(exec, "handleEvent"));
CallData handleEventCallData;
CallType handleEventCallType = handleEventFunction.getCallData(handleEventCallData);
CallData callbackCallData;
CallType callbackCallType = CallTypeNone;
if (handleEventCallType == CallTypeNone) {
callbackCallType = m_data->callback()->getCallData(callbackCallData);
if (callbackCallType == CallTypeNone) {
return;
}
}
RefPtr<JSCustomSQLTransactionCallback> protect(this);
MarkedArgumentBuffer args;
args.append(toJS(exec, transaction));
globalObject->globalData()->timeoutChecker.start();
if (handleEventCallType != CallTypeNone)
call(exec, handleEventFunction, handleEventCallType, handleEventCallData, m_data->callback(), args);
else
call(exec, m_data->callback(), callbackCallType, callbackCallData, m_data->callback(), args);
globalObject->globalData()->timeoutChecker.stop();
if (exec->hadException()) {
reportCurrentException(exec);
raisedException = true;
}
Document::updateStyleForAllDocuments();
}
}
#endif // ENABLE(DATABASE)