IndexedDB: Keep direction on IDBCursor to avoid calls to back end
authorjsbell@chromium.org <jsbell@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Jun 2012 03:09:32 +0000 (03:09 +0000)
committerjsbell@chromium.org <jsbell@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Jun 2012 03:09:32 +0000 (03:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=90114

Source/WebCore:

Reviewed by Tony Chang.

Let IDBCursor handle direction() accessor locally, without a call to
the IDBCursorBackendImpl which (in some ports) may reside in a different
process. Not a heavily called function, but further reduces the surface
area exposed by the XXXInterface classes.

No new tests - no functional changes.

* Modules/indexeddb/IDBCursor.cpp:
(WebCore::IDBCursor::create): Accept direction, known at creation time.
(WebCore::IDBCursor::IDBCursor): Stash in member.
(WebCore::IDBCursor::direction): Use local copy
(WebCore::IDBCursor::stringToDirection): Return enum value, not int.
* Modules/indexeddb/IDBCursor.h:
(IDBCursor):
* Modules/indexeddb/IDBCursorBackendImpl.cpp: Remove accessor.
* Modules/indexeddb/IDBCursorBackendImpl.h:
(IDBCursorBackendImpl):
* Modules/indexeddb/IDBCursorBackendInterface.h: Remove accessor.
* Modules/indexeddb/IDBCursorWithValue.cpp:
(WebCore::IDBCursorWithValue::create):
(WebCore::IDBCursorWithValue::IDBCursorWithValue):
* Modules/indexeddb/IDBCursorWithValue.h:
(IDBCursorWithValue):
* Modules/indexeddb/IDBIndex.cpp: Prep IDBRequest with cursor direction too.
(WebCore::IDBIndex::openCursor):
(WebCore::IDBIndex::openKeyCursor):
* Modules/indexeddb/IDBObjectStore.cpp: Ditto.
(WebCore::IDBObjectStore::openCursor):
* Modules/indexeddb/IDBRequest.cpp: Stash direction for pending cursor too.
(WebCore::IDBRequest::IDBRequest):
(WebCore::IDBRequest::setCursorDetails):
(WebCore::IDBRequest::onSuccess): Apply stashed direction to new cursor.
* Modules/indexeddb/IDBRequest.h:
(IDBRequest):

Source/WebKit/chromium:

Stop plumbing IDBCursorBackendInterface::direction() through API.

Reviewed by Tony Chang.

* src/IDBCursorBackendProxy.cpp:
* src/IDBCursorBackendProxy.h:
(IDBCursorBackendProxy):
* src/WebIDBCursorImpl.cpp:
* src/WebIDBCursorImpl.h:
(WebIDBCursorImpl):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@121612 268f45cc-cd09-0410-ab3c-d52691b4dbfc

17 files changed:
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBCursor.cpp
Source/WebCore/Modules/indexeddb/IDBCursor.h
Source/WebCore/Modules/indexeddb/IDBCursorBackendImpl.cpp
Source/WebCore/Modules/indexeddb/IDBCursorBackendImpl.h
Source/WebCore/Modules/indexeddb/IDBCursorBackendInterface.h
Source/WebCore/Modules/indexeddb/IDBCursorWithValue.cpp
Source/WebCore/Modules/indexeddb/IDBCursorWithValue.h
Source/WebCore/Modules/indexeddb/IDBIndex.cpp
Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp
Source/WebCore/Modules/indexeddb/IDBRequest.cpp
Source/WebCore/Modules/indexeddb/IDBRequest.h
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/src/IDBCursorBackendProxy.cpp
Source/WebKit/chromium/src/IDBCursorBackendProxy.h
Source/WebKit/chromium/src/WebIDBCursorImpl.cpp
Source/WebKit/chromium/src/WebIDBCursorImpl.h

index cbf2c26..26c7ead 100644 (file)
@@ -1,3 +1,45 @@
+2012-06-29  Joshua Bell  <jsbell@chromium.org>
+
+        IndexedDB: Keep direction on IDBCursor to avoid calls to back end
+        https://bugs.webkit.org/show_bug.cgi?id=90114
+
+        Reviewed by Tony Chang.
+
+        Let IDBCursor handle direction() accessor locally, without a call to
+        the IDBCursorBackendImpl which (in some ports) may reside in a different
+        process. Not a heavily called function, but further reduces the surface
+        area exposed by the XXXInterface classes.
+
+        No new tests - no functional changes.
+
+        * Modules/indexeddb/IDBCursor.cpp:
+        (WebCore::IDBCursor::create): Accept direction, known at creation time.
+        (WebCore::IDBCursor::IDBCursor): Stash in member.
+        (WebCore::IDBCursor::direction): Use local copy
+        (WebCore::IDBCursor::stringToDirection): Return enum value, not int.
+        * Modules/indexeddb/IDBCursor.h:
+        (IDBCursor):
+        * Modules/indexeddb/IDBCursorBackendImpl.cpp: Remove accessor.
+        * Modules/indexeddb/IDBCursorBackendImpl.h:
+        (IDBCursorBackendImpl):
+        * Modules/indexeddb/IDBCursorBackendInterface.h: Remove accessor.
+        * Modules/indexeddb/IDBCursorWithValue.cpp:
+        (WebCore::IDBCursorWithValue::create):
+        (WebCore::IDBCursorWithValue::IDBCursorWithValue):
+        * Modules/indexeddb/IDBCursorWithValue.h:
+        (IDBCursorWithValue):
+        * Modules/indexeddb/IDBIndex.cpp: Prep IDBRequest with cursor direction too.
+        (WebCore::IDBIndex::openCursor):
+        (WebCore::IDBIndex::openKeyCursor):
+        * Modules/indexeddb/IDBObjectStore.cpp: Ditto.
+        (WebCore::IDBObjectStore::openCursor):
+        * Modules/indexeddb/IDBRequest.cpp: Stash direction for pending cursor too.
+        (WebCore::IDBRequest::IDBRequest):
+        (WebCore::IDBRequest::setCursorDetails):
+        (WebCore::IDBRequest::onSuccess): Apply stashed direction to new cursor.
+        * Modules/indexeddb/IDBRequest.h:
+        (IDBRequest):
+
 2012-06-29  Tony Chang  <tony@chromium.org>
 
         Allow align-self: stretch to cause the item size to shrink below its intrinsic size
index a5ca5c7..5e90251 100644 (file)
@@ -42,9 +42,9 @@
 
 namespace WebCore {
 
-PassRefPtr<IDBCursor> IDBCursor::create(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
+PassRefPtr<IDBCursor> IDBCursor::create(PassRefPtr<IDBCursorBackendInterface> backend, Direction direction, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
 {
-    return adoptRef(new IDBCursor(backend, request, source, transaction));
+    return adoptRef(new IDBCursor(backend, direction, request, source, transaction));
 }
 
 const AtomicString& IDBCursor::directionNext()
@@ -72,9 +72,10 @@ const AtomicString& IDBCursor::directionPrevUnique()
 }
 
 
-IDBCursor::IDBCursor(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
+IDBCursor::IDBCursor(PassRefPtr<IDBCursorBackendInterface> backend, Direction direction, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
     : m_backend(backend)
     , m_request(request)
+    , m_direction(direction)
     , m_source(source)
     , m_transaction(transaction)
     , m_transactionNotifier(transaction, this)
@@ -95,7 +96,7 @@ const String& IDBCursor::direction() const
 {
     IDB_TRACE("IDBCursor::direction");
     ExceptionCode ec = 0;
-    const AtomicString& direction = directionToString(m_backend->direction(), ec);
+    const AtomicString& direction = directionToString(m_direction, ec);
     ASSERT(!ec);
     return direction;
 }
@@ -293,7 +294,7 @@ PassRefPtr<IDBObjectStore> IDBCursor::effectiveObjectStore()
     return index->objectStore();
 }
 
-unsigned short IDBCursor::stringToDirection(const String& directionString, ExceptionCode& ec)
+IDBCursor::Direction IDBCursor::stringToDirection(const String& directionString, ExceptionCode& ec)
 {
     if (directionString == IDBCursor::directionNext())
         return IDBCursor::NEXT;
@@ -305,7 +306,7 @@ unsigned short IDBCursor::stringToDirection(const String& directionString, Excep
         return IDBCursor::PREV_NO_DUPLICATE;
 
     ec = IDBDatabaseException::IDB_TYPE_ERR;
-    return 0;
+    return IDBCursor::NEXT;
 }
 
 const AtomicString& IDBCursor::directionToString(unsigned short direction, ExceptionCode& ec)
index 4f4564e..fd46cbb 100644 (file)
@@ -59,10 +59,10 @@ public:
     static const AtomicString& directionPrev();
     static const AtomicString& directionPrevUnique();
 
-    static unsigned short stringToDirection(const String& modeString, ExceptionCode&);
+    static IDBCursor::Direction stringToDirection(const String& modeString, ExceptionCode&);
     static const AtomicString& directionToString(unsigned short mode, ExceptionCode&);
 
-    static PassRefPtr<IDBCursor> create(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBAny* source, IDBTransaction*);
+    static PassRefPtr<IDBCursor> create(PassRefPtr<IDBCursorBackendInterface>, Direction, IDBRequest*, IDBAny* source, IDBTransaction*);
     virtual ~IDBCursor();
 
     // FIXME: Try to modify the code generator so this is unneeded.
@@ -90,7 +90,7 @@ public:
     bool valueIsDirty() { return m_valueIsDirty; }
 
 protected:
-    IDBCursor(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBAny* source, IDBTransaction*);
+    IDBCursor(PassRefPtr<IDBCursorBackendInterface>, Direction, IDBRequest*, IDBAny* source, IDBTransaction*);
     virtual bool isKeyCursor() const { return true; }
 
 private:
@@ -98,6 +98,7 @@ private:
 
     RefPtr<IDBCursorBackendInterface> m_backend;
     RefPtr<IDBRequest> m_request;
+    const Direction m_direction;
     RefPtr<IDBAny> m_source;
     RefPtr<IDBTransaction> m_transaction;
     IDBTransaction::OpenCursorNotifier m_transactionNotifier;
index 0a14a6f..fe58988 100644 (file)
@@ -63,12 +63,6 @@ IDBCursorBackendImpl::~IDBCursorBackendImpl()
     m_objectStore.clear();
 }
 
-unsigned short IDBCursorBackendImpl::direction() const
-{
-    IDB_TRACE("IDBCursorBackendImpl::direction");
-    return m_direction;
-}
-
 PassRefPtr<IDBKey> IDBCursorBackendImpl::key() const
 {
     IDB_TRACE("IDBCursorBackendImpl::key");
index 89dde4f..153016f 100644 (file)
@@ -53,7 +53,6 @@ public:
     }
     virtual ~IDBCursorBackendImpl();
 
-    virtual unsigned short direction() const;
     virtual PassRefPtr<IDBKey> key() const;
     virtual PassRefPtr<IDBKey> primaryKey() const;
     virtual PassRefPtr<SerializedScriptValue> value() const;
index 9712328..48d3a18 100644 (file)
@@ -53,7 +53,6 @@ public:
         ObjectStoreCursor
     };
 
-    virtual unsigned short direction() const = 0;
     virtual PassRefPtr<IDBKey> key() const = 0;
     virtual PassRefPtr<IDBKey> primaryKey() const = 0;
     virtual PassRefPtr<SerializedScriptValue> value() const = 0;
index 30d242c..b90ba3d 100644 (file)
@@ -33,9 +33,9 @@
 
 namespace WebCore {
 
-PassRefPtr<IDBCursorWithValue> IDBCursorWithValue::create(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
+PassRefPtr<IDBCursorWithValue> IDBCursorWithValue::create(PassRefPtr<IDBCursorBackendInterface> backend, Direction direction, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
 {
-    return adoptRef(new IDBCursorWithValue(backend, request, source, transaction));
+    return adoptRef(new IDBCursorWithValue(backend, direction, request, source, transaction));
 }
 
 PassRefPtr<IDBCursorWithValue> IDBCursorWithValue::fromCursor(PassRefPtr<IDBCursor> prpCursor)
@@ -44,8 +44,8 @@ PassRefPtr<IDBCursorWithValue> IDBCursorWithValue::fromCursor(PassRefPtr<IDBCurs
     return cursorWithValue.release();
 }
 
-IDBCursorWithValue::IDBCursorWithValue(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
-    : IDBCursor(backend, request, source, transaction)
+IDBCursorWithValue::IDBCursorWithValue(PassRefPtr<IDBCursorBackendInterface> backend, Direction direction, IDBRequest* request, IDBAny* source, IDBTransaction* transaction)
+    : IDBCursor(backend, direction, request, source, transaction)
 {
 }
 
index 9b396ba..cbb850a 100644 (file)
@@ -34,7 +34,7 @@ namespace WebCore {
 
 class IDBCursorWithValue : public IDBCursor {
 public:
-    static PassRefPtr<IDBCursorWithValue> create(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBAny* source, IDBTransaction*);
+    static PassRefPtr<IDBCursorWithValue> create(PassRefPtr<IDBCursorBackendInterface>, Direction, IDBRequest*, IDBAny* source, IDBTransaction*);
     static PassRefPtr<IDBCursorWithValue> fromCursor(PassRefPtr<IDBCursor>);
     virtual ~IDBCursorWithValue();
 
@@ -45,7 +45,7 @@ protected:
     virtual bool isKeyCursor() const OVERRIDE { return false; }
 
 private:
-    IDBCursorWithValue(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBAny* source, IDBTransaction*);
+    IDBCursorWithValue(PassRefPtr<IDBCursorBackendInterface>, Direction, IDBRequest*, IDBAny* source, IDBTransaction*);
 };
 
 } // namespace WebCore
index fd93949..fec9680 100644 (file)
@@ -69,12 +69,12 @@ PassRefPtr<IDBRequest> IDBIndex::openCursor(ScriptExecutionContext* context, Pas
         ec = IDBDatabaseException::TRANSACTION_INACTIVE_ERR;
         return 0;
     }
-    unsigned short direction = IDBCursor::stringToDirection(directionString, ec);
+    IDBCursor::Direction direction = IDBCursor::stringToDirection(directionString, ec);
     if (ec)
         return 0;
 
     RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get());
-    request->setCursorType(IDBCursorBackendInterface::IndexCursor);
+    request->setCursorDetails(IDBCursorBackendInterface::IndexCursor, direction);
     m_backend->openCursor(keyRange, direction, request, m_transaction->backend(), ec);
     if (ec) {
         request->markEarlyDeath();
@@ -152,13 +152,12 @@ PassRefPtr<IDBRequest> IDBIndex::openKeyCursor(ScriptExecutionContext* context,
         ec = IDBDatabaseException::TRANSACTION_INACTIVE_ERR;
         return 0;
     }
-
-    unsigned short direction = IDBCursor::stringToDirection(directionString, ec);
+    IDBCursor::Direction direction = IDBCursor::stringToDirection(directionString, ec);
     if (ec)
         return 0;
 
     RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get());
-    request->setCursorType(IDBCursorBackendInterface::IndexKeyCursor);
+    request->setCursorDetails(IDBCursorBackendInterface::IndexKeyCursor, direction);
     m_backend->openKeyCursor(keyRange, direction, request, m_transaction->backend(), ec);
     if (ec) {
         request->markEarlyDeath();
index 6c06415..65f222b 100644 (file)
@@ -375,12 +375,12 @@ PassRefPtr<IDBRequest> IDBObjectStore::openCursor(ScriptExecutionContext* contex
         ec = IDBDatabaseException::TRANSACTION_INACTIVE_ERR;
         return 0;
     }
-    unsigned short direction = IDBCursor::stringToDirection(directionString, ec);
+    IDBCursor::Direction direction = IDBCursor::stringToDirection(directionString, ec);
     if (ec)
         return 0;
 
     RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get());
-    request->setCursorType(IDBCursorBackendInterface::ObjectStoreCursor);
+    request->setCursorDetails(IDBCursorBackendInterface::ObjectStoreCursor, direction);
     m_backend->openCursor(range, direction, request, m_transaction->backend(), ec);
     if (ec) {
         request->markEarlyDeath();
index 0fda681..0885cac 100644 (file)
@@ -61,6 +61,7 @@ IDBRequest::IDBRequest(ScriptExecutionContext* context, PassRefPtr<IDBAny> sourc
     , m_cursorFinished(false)
     , m_contextStopped(false)
     , m_cursorType(IDBCursorBackendInterface::InvalidCursorType)
+    , m_cursorDirection(IDBCursor::NEXT)
     , m_cursor(0)
 {
     if (m_transaction) {
@@ -187,10 +188,11 @@ void IDBRequest::abort()
     onError(IDBDatabaseError::create(IDBDatabaseException::IDB_ABORT_ERR, "The transaction was aborted, so the request cannot be fulfilled."));
 }
 
-void IDBRequest::setCursorType(IDBCursorBackendInterface::CursorType cursorType)
+void IDBRequest::setCursorDetails(IDBCursorBackendInterface::CursorType cursorType, IDBCursor::Direction direction)
 {
     ASSERT(m_cursorType == IDBCursorBackendInterface::InvalidCursorType);
     m_cursorType = cursorType;
+    m_cursorDirection = direction;
 }
 
 void IDBRequest::setCursor(PassRefPtr<IDBCursor> cursor)
@@ -237,9 +239,9 @@ void IDBRequest::onSuccess(PassRefPtr<IDBCursorBackendInterface> backend)
     ASSERT(m_cursorType != IDBCursorBackendInterface::InvalidCursorType);
     RefPtr<IDBCursor> cursor;
     if (m_cursorType == IDBCursorBackendInterface::IndexKeyCursor)
-        cursor = IDBCursor::create(backend, this, m_source.get(), m_transaction.get());
+        cursor = IDBCursor::create(backend, m_cursorDirection, this, m_source.get(), m_transaction.get());
     else
-        cursor = IDBCursorWithValue::create(backend, this, m_source.get(), m_transaction.get());
+        cursor = IDBCursorWithValue::create(backend, m_cursorDirection, this, m_source.get(), m_transaction.get());
     setResultCursor(cursor, m_cursorType);
 
     enqueueEvent(createSuccessEvent());
index 88a7e60..4907244 100644 (file)
@@ -40,6 +40,7 @@
 #include "EventTarget.h"
 #include "IDBAny.h"
 #include "IDBCallbacks.h"
+#include "IDBCursor.h"
 
 namespace WebCore {
 
@@ -73,7 +74,7 @@ public:
 
     void markEarlyDeath();
     bool resetReadyState(IDBTransaction*);
-    void setCursorType(IDBCursorBackendInterface::CursorType);
+    void setCursorDetails(IDBCursorBackendInterface::CursorType, IDBCursor::Direction);
     void setCursor(PassRefPtr<IDBCursor>);
     void finishCursor();
     IDBAny* source();
@@ -134,6 +135,7 @@ private:
 
     // Only used if the result type will be a cursor.
     IDBCursorBackendInterface::CursorType m_cursorType;
+    IDBCursor::Direction m_cursorDirection;
     RefPtr<IDBCursor> m_cursor;
 
     EventTargetData m_eventTargetData;
index ad626aa..3ebaf0f 100644 (file)
@@ -1,3 +1,19 @@
+2012-06-29  Joshua Bell  <jsbell@chromium.org>
+
+        IndexedDB: Keep direction on IDBCursor to avoid calls to back end
+        https://bugs.webkit.org/show_bug.cgi?id=90114
+
+        Stop plumbing IDBCursorBackendInterface::direction() through API.
+
+        Reviewed by Tony Chang.
+
+        * src/IDBCursorBackendProxy.cpp:
+        * src/IDBCursorBackendProxy.h:
+        (IDBCursorBackendProxy):
+        * src/WebIDBCursorImpl.cpp:
+        * src/WebIDBCursorImpl.h:
+        (WebIDBCursorImpl):
+
 2012-06-29  Adam Barth  <abarth@webkit.org>
 
         [Chromium] WebFontRendering.cpp requires some OS(ANDROID) ifdefs to build downstream
index 2a62b92..ca390ba 100644 (file)
@@ -54,11 +54,6 @@ IDBCursorBackendProxy::~IDBCursorBackendProxy()
 {
 }
 
-unsigned short IDBCursorBackendProxy::direction() const
-{
-    return m_idbCursor->direction();
-}
-
 PassRefPtr<IDBKey> IDBCursorBackendProxy::key() const
 {
     return m_idbCursor->key();
index 24a3e42..9e4b570 100644 (file)
@@ -42,7 +42,6 @@ public:
     static PassRefPtr<WebCore::IDBCursorBackendInterface> create(PassOwnPtr<WebIDBCursor>);
     virtual ~IDBCursorBackendProxy();
 
-    virtual unsigned short direction() const;
     virtual PassRefPtr<WebCore::IDBKey> key() const;
     virtual PassRefPtr<WebCore::IDBKey> primaryKey() const;
     virtual PassRefPtr<WebCore::SerializedScriptValue> value() const;
index 6f10efe..e9c0e04 100644 (file)
@@ -47,11 +47,6 @@ WebIDBCursorImpl::~WebIDBCursorImpl()
 {
 }
 
-unsigned short WebIDBCursorImpl::direction() const
-{
-    return m_idbCursorBackend->direction();
-}
-
 WebIDBKey WebIDBCursorImpl::key() const
 {
     return m_idbCursorBackend->key();
index 4186751..f0d387b 100644 (file)
@@ -44,7 +44,6 @@ public:
     WebIDBCursorImpl(WTF::PassRefPtr<WebCore::IDBCursorBackendInterface>);
     virtual ~WebIDBCursorImpl();
 
-    virtual unsigned short direction() const;
     virtual WebIDBKey key() const;
     virtual WebIDBKey primaryKey() const;
     virtual WebSerializedScriptValue value() const;