18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
3021939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "JSSQLStatementErrorCallback.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE)
338ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSSQLError.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSSQLTransaction.h"
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ScriptExecutionContext.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/JSLock.h>
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC;
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
43dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool JSSQLStatementErrorCallback::handleEvent(SQLTransaction* transaction, SQLError* error)
44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
45dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!m_data || !m_data->globalObject() || !canInvokeCallback())
46dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return true;
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4821939df44de1705786c545cd1bf519d47250322dBen Murdoch    RefPtr<JSSQLStatementErrorCallback> protect(this);
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSC::JSLock lock(SilenceAssertionsOnly);
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ExecState* exec = m_data->globalObject()->globalExec();
535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    MarkedArgumentBuffer args;
54dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    args.append(toJS(exec, transaction));
55dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    args.append(toJS(exec, error));
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    bool raisedException = false;
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSValue result = m_data->invokeCallback(args, &raisedException);
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (raisedException) {
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The spec says:
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // "If the error callback returns false, then move on to the next statement..."
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // "Otherwise, the error callback did not return false, or there was no error callback"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Therefore an exception and returning true are the same thing - so, return true on an exception
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result.toBoolean(exec);
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
708ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch
718ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif // ENABLE(DATABASE)
72