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
+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
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()
}
-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)
{
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;
}
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;
return IDBCursor::PREV_NO_DUPLICATE;
ec = IDBDatabaseException::IDB_TYPE_ERR;
- return 0;
+ return IDBCursor::NEXT;
}
const AtomicString& IDBCursor::directionToString(unsigned short direction, ExceptionCode& ec)
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.
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:
RefPtr<IDBCursorBackendInterface> m_backend;
RefPtr<IDBRequest> m_request;
+ const Direction m_direction;
RefPtr<IDBAny> m_source;
RefPtr<IDBTransaction> m_transaction;
IDBTransaction::OpenCursorNotifier m_transactionNotifier;
m_objectStore.clear();
}
-unsigned short IDBCursorBackendImpl::direction() const
-{
- IDB_TRACE("IDBCursorBackendImpl::direction");
- return m_direction;
-}
-
PassRefPtr<IDBKey> IDBCursorBackendImpl::key() const
{
IDB_TRACE("IDBCursorBackendImpl::key");
}
virtual ~IDBCursorBackendImpl();
- virtual unsigned short direction() const;
virtual PassRefPtr<IDBKey> key() const;
virtual PassRefPtr<IDBKey> primaryKey() const;
virtual PassRefPtr<SerializedScriptValue> value() const;
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;
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)
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)
{
}
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();
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
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();
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();
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();
, m_cursorFinished(false)
, m_contextStopped(false)
, m_cursorType(IDBCursorBackendInterface::InvalidCursorType)
+ , m_cursorDirection(IDBCursor::NEXT)
, m_cursor(0)
{
if (m_transaction) {
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)
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());
#include "EventTarget.h"
#include "IDBAny.h"
#include "IDBCallbacks.h"
+#include "IDBCursor.h"
namespace WebCore {
void markEarlyDeath();
bool resetReadyState(IDBTransaction*);
- void setCursorType(IDBCursorBackendInterface::CursorType);
+ void setCursorDetails(IDBCursorBackendInterface::CursorType, IDBCursor::Direction);
void setCursor(PassRefPtr<IDBCursor>);
void finishCursor();
IDBAny* source();
// 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;
+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
{
}
-unsigned short IDBCursorBackendProxy::direction() const
-{
- return m_idbCursor->direction();
-}
-
PassRefPtr<IDBKey> IDBCursorBackendProxy::key() const
{
return m_idbCursor->key();
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;
{
}
-unsigned short WebIDBCursorImpl::direction() const
-{
- return m_idbCursorBackend->direction();
-}
-
WebIDBKey WebIDBCursorImpl::key() const
{
return m_idbCursorBackend->key();
WebIDBCursorImpl(WTF::PassRefPtr<WebCore::IDBCursorBackendInterface>);
virtual ~WebIDBCursorImpl();
- virtual unsigned short direction() const;
virtual WebIDBKey key() const;
virtual WebIDBKey primaryKey() const;
virtual WebSerializedScriptValue value() const;