Diff
Modified: trunk/Source/WebCore/ChangeLog (99168 => 99169)
--- trunk/Source/WebCore/ChangeLog 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebCore/ChangeLog 2011-11-03 12:03:55 UTC (rev 99169)
@@ -1,3 +1,29 @@
+2011-10-31 Hans Wennborg <[email protected]>
+
+ IndexedDB: Recycle cursor objects when calling continue()
+ https://bugs.webkit.org/show_bug.cgi?id=71115
+
+ Reviewed by Darin Fisher.
+
+ The IndexedDB spec says that cursors should be recycled when calling
+ continue(). Let the IDBRequest keep track of which cursor to return
+ upon success, and have the cursor use a new callback:
+ onSuccessWithContinuation() to signal that the continue was successful.
+
+ When we start using the new callback, the
+ storage/indexeddb/cursor-inconsistency.html layout test will start
+ passing.
+
+ * storage/IDBCallbacks.h:
+ * storage/IDBCursorBackendImpl.cpp:
+ (WebCore::IDBCursorBackendImpl::continueFunctionInternal):
+ * storage/IDBRequest.cpp:
+ (WebCore::IDBRequest::IDBRequest):
+ (WebCore::IDBRequest::setCursor):
+ (WebCore::IDBRequest::onSuccess):
+ (WebCore::IDBRequest::onSuccessWithContinuation):
+ * storage/IDBRequest.h:
+
2011-11-03 Pavel Feldman <[email protected]>
Web Inspector: preserve script location for inline handlers.
Modified: trunk/Source/WebCore/storage/IDBCallbacks.h (99168 => 99169)
--- trunk/Source/WebCore/storage/IDBCallbacks.h 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebCore/storage/IDBCallbacks.h 2011-11-03 12:03:55 UTC (rev 99169)
@@ -55,6 +55,7 @@
virtual void onSuccess(PassRefPtr<IDBKey>) = 0;
virtual void onSuccess(PassRefPtr<IDBTransactionBackendInterface>) = 0;
virtual void onSuccess(PassRefPtr<SerializedScriptValue>) = 0;
+ virtual void onSuccessWithContinuation() = 0;
virtual void onBlocked() = 0;
};
Modified: trunk/Source/WebCore/storage/IDBCursor.cpp (99168 => 99169)
--- trunk/Source/WebCore/storage/IDBCursor.cpp 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebCore/storage/IDBCursor.cpp 2011-11-03 12:03:55 UTC (rev 99169)
@@ -105,9 +105,10 @@
// FIXME: We're not using the context from when continue was called, which means the callback
// will be on the original context openCursor was called on. Is this right?
- if (m_request->resetReadyState(m_transaction.get()))
+ if (m_request->resetReadyState(m_transaction.get())) {
m_backend->continueFunction(key, m_request, ec);
- else
+ m_request->setCursor(this);
+ } else
ec = IDBDatabaseException::NOT_ALLOWED_ERR;
}
Modified: trunk/Source/WebCore/storage/IDBCursorBackendImpl.cpp (99168 => 99169)
--- trunk/Source/WebCore/storage/IDBCursorBackendImpl.cpp 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebCore/storage/IDBCursorBackendImpl.cpp 2011-11-03 12:03:55 UTC (rev 99169)
@@ -110,7 +110,7 @@
return;
}
- callbacks->onSuccess(cursor.get());
+ callbacks->onSuccess(cursor.get()); // FIXME: After Chromium side is ready, this should be callbacks->onSuccessWithContinuation();
}
void IDBCursorBackendImpl::deleteFunction(PassRefPtr<IDBCallbacks> prpCallbacks, ExceptionCode& ec)
Modified: trunk/Source/WebCore/storage/IDBCursorWithValue.cpp (99168 => 99169)
--- trunk/Source/WebCore/storage/IDBCursorWithValue.cpp 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebCore/storage/IDBCursorWithValue.cpp 2011-11-03 12:03:55 UTC (rev 99169)
@@ -38,6 +38,12 @@
return adoptRef(new IDBCursorWithValue(backend, request, source, transaction));
}
+PassRefPtr<IDBCursorWithValue> IDBCursorWithValue::fromCursor(PassRefPtr<IDBCursor> prpCursor)
+{
+ RefPtr<IDBCursorWithValue> cursorWithValue(static_cast<IDBCursorWithValue*>(prpCursor.get()));
+ return cursorWithValue.release();
+}
+
IDBCursorWithValue::IDBCursorWithValue(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
: IDBCursor(backend, request, source, transaction)
{
Modified: trunk/Source/WebCore/storage/IDBCursorWithValue.h (99168 => 99169)
--- trunk/Source/WebCore/storage/IDBCursorWithValue.h 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebCore/storage/IDBCursorWithValue.h 2011-11-03 12:03:55 UTC (rev 99169)
@@ -35,6 +35,7 @@
class IDBCursorWithValue : public IDBCursor {
public:
static PassRefPtr<IDBCursorWithValue> create(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBAny* source, IDBTransaction*);
+ static PassRefPtr<IDBCursorWithValue> fromCursor(PassRefPtr<IDBCursor>);
virtual ~IDBCursorWithValue();
// The value attribute defined in the IDL is simply implemented in IDBCursor (but not exposed via
Modified: trunk/Source/WebCore/storage/IDBRequest.cpp (99168 => 99169)
--- trunk/Source/WebCore/storage/IDBRequest.cpp 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebCore/storage/IDBRequest.cpp 2011-11-03 12:03:55 UTC (rev 99169)
@@ -56,6 +56,7 @@
, m_readyState(LOADING)
, m_finished(false)
, m_cursorType(IDBCursorBackendInterface::InvalidCursorType)
+ , m_cursor(0)
{
if (m_transaction) {
m_transaction->registerRequest(this);
@@ -170,11 +171,18 @@
m_cursorType = cursorType;
}
+void IDBRequest::setCursor(PassRefPtr<IDBCursor> cursor)
+{
+ // FIXME: Assert !m_cursor when the new onSuccessCursorContinue() callback is used.
+ m_cursor = cursor;
+}
+
void IDBRequest::onError(PassRefPtr<IDBDatabaseError> error)
{
ASSERT(!m_errorCode && m_errorMessage.isNull() && !m_result);
m_errorCode = error->code();
m_errorMessage = error->message();
+ m_cursor.clear();
enqueueEvent(Event::create(eventNames().errorEvent, true, true));
}
@@ -194,10 +202,15 @@
{
ASSERT(!m_errorCode && m_errorMessage.isNull() && !m_result);
ASSERT(m_cursorType != IDBCursorBackendInterface::InvalidCursorType);
+
+ RefPtr<IDBCursor> cursor;
if (m_cursorType == IDBCursorBackendInterface::IndexKeyCursor)
- m_result = IDBAny::create(IDBCursor::create(backend, this, m_source.get(), m_transaction.get()));
+ cursor = IDBCursor::create(backend, this, m_source.get(), m_transaction.get());
else
- m_result = IDBAny::create(IDBCursorWithValue::create(backend, this, m_source.get(), m_transaction.get()));
+ cursor = IDBCursorWithValue::create(backend, this, m_source.get(), m_transaction.get());
+
+ setResultCursor(cursor, m_cursorType);
+
enqueueEvent(createSuccessEvent());
}
@@ -242,9 +255,20 @@
{
ASSERT(!m_errorCode && m_errorMessage.isNull() && !m_result);
m_result = IDBAny::create(serializedScriptValue);
+ m_cursor.clear();
enqueueEvent(createSuccessEvent());
}
+void IDBRequest::onSuccessWithContinuation()
+{
+ ASSERT(!m_errorCode && m_errorMessage.isNull() && !m_result);
+ ASSERT(m_cursor);
+
+ setResultCursor(m_cursor, m_cursorType);
+ m_cursor.clear();
+ enqueueEvent(createSuccessEvent());
+}
+
bool IDBRequest::hasPendingActivity() const
{
// FIXME: In an ideal world, we should return true as long as anyone has a or can
@@ -340,6 +364,16 @@
return &m_eventTargetData;
}
+void IDBRequest::setResultCursor(PassRefPtr<IDBCursor> prpCursor, IDBCursorBackendInterface::CursorType type)
+{
+ if (type == IDBCursorBackendInterface::IndexKeyCursor) {
+ m_result = IDBAny::create(prpCursor);
+ return;
+ }
+
+ m_result = IDBAny::create(IDBCursorWithValue::fromCursor(prpCursor));
+}
+
} // namespace WebCore
#endif
Modified: trunk/Source/WebCore/storage/IDBRequest.h (99168 => 99169)
--- trunk/Source/WebCore/storage/IDBRequest.h 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebCore/storage/IDBRequest.h 2011-11-03 12:03:55 UTC (rev 99169)
@@ -70,6 +70,7 @@
void markEarlyDeath();
bool resetReadyState(IDBTransaction*);
void setCursorType(IDBCursorBackendInterface::CursorType);
+ void setCursor(PassRefPtr<IDBCursor>);
IDBAny* source();
void abort();
@@ -81,6 +82,7 @@
virtual void onSuccess(PassRefPtr<IDBKey>);
virtual void onSuccess(PassRefPtr<IDBTransactionBackendInterface>);
virtual void onSuccess(PassRefPtr<SerializedScriptValue>);
+ virtual void onSuccessWithContinuation();
virtual void onBlocked();
// ActiveDOMObject
@@ -110,6 +112,8 @@
virtual EventTargetData* eventTargetData();
virtual EventTargetData* ensureEventTargetData();
+ void setResultCursor(PassRefPtr<IDBCursor>, IDBCursorBackendInterface::CursorType);
+
RefPtr<IDBAny> m_source;
RefPtr<IDBTransaction> m_transaction;
@@ -119,6 +123,7 @@
// Only used if the result type will be a cursor.
IDBCursorBackendInterface::CursorType m_cursorType;
+ RefPtr<IDBCursor> m_cursor;
EventTargetData m_eventTargetData;
};
Modified: trunk/Source/WebKit/chromium/ChangeLog (99168 => 99169)
--- trunk/Source/WebKit/chromium/ChangeLog 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebKit/chromium/ChangeLog 2011-11-03 12:03:55 UTC (rev 99169)
@@ -1,3 +1,21 @@
+2011-10-28 Hans Wennborg <[email protected]>
+
+ IndexedDB: Recycle cursor objects when calling continue()
+ https://bugs.webkit.org/show_bug.cgi?id=71115
+
+ Reviewed by Darin Fisher.
+
+ Add the new onSuccessWithContinuation() callback to IDB wrappers.
+
+ * public/WebIDBCallbacks.h:
+ (WebKit::WebIDBCallbacks::onSuccessWithContinuation):
+ * src/IDBCallbacksProxy.cpp:
+ (WebKit::IDBCallbacksProxy::onSuccessWithContinuation):
+ * src/IDBCallbacksProxy.h:
+ * src/WebIDBCallbacksImpl.cpp:
+ (WebKit::WebIDBCallbacksImpl::onSuccessWithContinuation):
+ * src/WebIDBCallbacksImpl.h:
+
2011-11-02 Pavel Feldman <[email protected]>
Web Inspector [chromium]: fix debug front-end zip generation.
Modified: trunk/Source/WebKit/chromium/public/WebIDBCallbacks.h (99168 => 99169)
--- trunk/Source/WebKit/chromium/public/WebIDBCallbacks.h 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebKit/chromium/public/WebIDBCallbacks.h 2011-11-03 12:03:55 UTC (rev 99169)
@@ -53,6 +53,7 @@
virtual void onSuccess(const WebIDBKey&) { WEBKIT_ASSERT_NOT_REACHED(); }
virtual void onSuccess(WebIDBTransaction*) { WEBKIT_ASSERT_NOT_REACHED(); }
virtual void onSuccess(const WebSerializedScriptValue&) { WEBKIT_ASSERT_NOT_REACHED(); }
+ virtual void onSuccessWithContinuation() { WEBKIT_ASSERT_NOT_REACHED(); }
virtual void onBlocked() { WEBKIT_ASSERT_NOT_REACHED(); }
};
Modified: trunk/Source/WebKit/chromium/src/IDBCallbacksProxy.cpp (99168 => 99169)
--- trunk/Source/WebKit/chromium/src/IDBCallbacksProxy.cpp 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebKit/chromium/src/IDBCallbacksProxy.cpp 2011-11-03 12:03:55 UTC (rev 99169)
@@ -94,6 +94,11 @@
m_callbacks->onSuccess(WebSerializedScriptValue(serializedScriptValue));
}
+void IDBCallbacksProxy::onSuccessWithContinuation()
+{
+ m_callbacks->onSuccessWithContinuation();
+}
+
void IDBCallbacksProxy::onBlocked()
{
m_callbacks->onBlocked();
Modified: trunk/Source/WebKit/chromium/src/IDBCallbacksProxy.h (99168 => 99169)
--- trunk/Source/WebKit/chromium/src/IDBCallbacksProxy.h 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebKit/chromium/src/IDBCallbacksProxy.h 2011-11-03 12:03:55 UTC (rev 99169)
@@ -52,6 +52,7 @@
virtual void onSuccess(PassRefPtr<WebCore::IDBKey>);
virtual void onSuccess(PassRefPtr<WebCore::IDBTransactionBackendInterface>);
virtual void onSuccess(PassRefPtr<WebCore::SerializedScriptValue>);
+ virtual void onSuccessWithContinuation();
virtual void onBlocked();
private:
Modified: trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.cpp (99168 => 99169)
--- trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.cpp 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.cpp 2011-11-03 12:03:55 UTC (rev 99169)
@@ -90,6 +90,11 @@
m_callbacks->onSuccess(serializedScriptValue);
}
+void WebIDBCallbacksImpl::onSuccessWithContinuation()
+{
+ m_callbacks->onSuccessWithContinuation();
+}
+
void WebIDBCallbacksImpl::onBlocked()
{
m_callbacks->onBlocked();
Modified: trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.h (99168 => 99169)
--- trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.h 2011-11-03 12:03:51 UTC (rev 99168)
+++ trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.h 2011-11-03 12:03:55 UTC (rev 99169)
@@ -48,6 +48,7 @@
virtual void onSuccess(const WebIDBKey&);
virtual void onSuccess(WebIDBTransaction*);
virtual void onSuccess(const WebSerializedScriptValue&);
+ virtual void onSuccessWithContinuation();
virtual void onBlocked();
private: