Title: [99169] trunk/Source
Revision
99169
Author
[email protected]
Date
2011-11-03 05:03:55 -0700 (Thu, 03 Nov 2011)

Log Message

IndexedDB: Recycle cursor objects when calling continue()
https://bugs.webkit.org/show_bug.cgi?id=71115

Reviewed by Darin Fisher.

Source/WebCore:

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:

Source/WebKit/chromium:

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:

Modified Paths

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:
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to