Title: [133855] trunk
Revision
133855
Author
vse...@chromium.org
Date
2012-11-07 23:32:34 -0800 (Wed, 07 Nov 2012)

Log Message

Web Inspector: Migrate inspector IndexedDB support to frontend API.
https://bugs.webkit.org/show_bug.cgi?id=101457

Reviewed by Pavel Feldman.

Source/WebCore:

Migrated IndexedDB support to web facing IndexedDB API.

* inspector/Inspector.json:
* inspector/InspectorIndexedDBAgent.cpp:
(WebCore):
(WebCore::assertIDBFactory):
(WebCore::InspectorIndexedDBAgent::requestDatabaseNamesForFrame):
(WebCore::InspectorIndexedDBAgent::requestDatabase):
(WebCore::InspectorIndexedDBAgent::requestData):
* inspector/front-end/IndexedDBModel.js:
(WebInspector.IndexedDBModel.prototype.innerCallback):
(WebInspector.IndexedDBModel.prototype._requestData):
* inspector/front-end/IndexedDBViews.js:
(WebInspector.IDBDataView.prototype._updateData.callback):
(WebInspector.IDBDataView.prototype._updateData):
(WebInspector.IDBDataGridNode):
(WebInspector.IDBDataGridNode.prototype.createCell):

LayoutTests:

* http/tests/inspector/indexeddb/database-data.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (133854 => 133855)


--- trunk/LayoutTests/ChangeLog	2012-11-08 07:29:06 UTC (rev 133854)
+++ trunk/LayoutTests/ChangeLog	2012-11-08 07:32:34 UTC (rev 133855)
@@ -1,5 +1,14 @@
 2012-11-07  Vsevolod Vlasov  <vse...@chromium.org>
 
+        Web Inspector: Migrate inspector IndexedDB support to frontend API.
+        https://bugs.webkit.org/show_bug.cgi?id=101457
+
+        Reviewed by Pavel Feldman.
+
+        * http/tests/inspector/indexeddb/database-data.html:
+
+2012-11-07  Vsevolod Vlasov  <vse...@chromium.org>
+
         Web Inspector: Infinite loop in DataGrid::autoSizeColumn
         https://bugs.webkit.org/show_bug.cgi?id=101363
 

Modified: trunk/LayoutTests/http/tests/inspector/indexeddb/database-data.html (133854 => 133855)


--- trunk/LayoutTests/http/tests/inspector/indexeddb/database-data.html	2012-11-08 07:29:06 UTC (rev 133854)
+++ trunk/LayoutTests/http/tests/inspector/indexeddb/database-data.html	2012-11-08 07:32:34 UTC (rev 133855)
@@ -67,7 +67,7 @@
 
             function dumped(value)
             {
-                InspectorTest.addResult("    Key = " + entry.key + ", primaryKey = " + entry.primaryKey + ", value = " + value);
+                InspectorTest.addResult("    Key = " + entry.key.description + ", primaryKey = " + entry.primaryKey.description + ", value = " + value);
                 dumpEntries();
             }
         }

Modified: trunk/Source/WebCore/ChangeLog (133854 => 133855)


--- trunk/Source/WebCore/ChangeLog	2012-11-08 07:29:06 UTC (rev 133854)
+++ trunk/Source/WebCore/ChangeLog	2012-11-08 07:32:34 UTC (rev 133855)
@@ -1,3 +1,28 @@
+2012-11-07  Vsevolod Vlasov  <vse...@chromium.org>
+
+        Web Inspector: Migrate inspector IndexedDB support to frontend API.
+        https://bugs.webkit.org/show_bug.cgi?id=101457
+
+        Reviewed by Pavel Feldman.
+
+        Migrated IndexedDB support to web facing IndexedDB API.
+
+        * inspector/Inspector.json:
+        * inspector/InspectorIndexedDBAgent.cpp:
+        (WebCore):
+        (WebCore::assertIDBFactory):
+        (WebCore::InspectorIndexedDBAgent::requestDatabaseNamesForFrame):
+        (WebCore::InspectorIndexedDBAgent::requestDatabase):
+        (WebCore::InspectorIndexedDBAgent::requestData):
+        * inspector/front-end/IndexedDBModel.js:
+        (WebInspector.IndexedDBModel.prototype.innerCallback):
+        (WebInspector.IndexedDBModel.prototype._requestData):
+        * inspector/front-end/IndexedDBViews.js:
+        (WebInspector.IDBDataView.prototype._updateData.callback):
+        (WebInspector.IDBDataView.prototype._updateData):
+        (WebInspector.IDBDataGridNode):
+        (WebInspector.IDBDataGridNode.prototype.createCell):
+
 2012-08-20  Taiju Tsuiki  <t...@chromium.org>
 
         Web Inspector: Drop dimmed crumb handling

Modified: trunk/Source/WebCore/inspector/Inspector.json (133854 => 133855)


--- trunk/Source/WebCore/inspector/Inspector.json	2012-11-08 07:29:06 UTC (rev 133854)
+++ trunk/Source/WebCore/inspector/Inspector.json	2012-11-08 07:32:34 UTC (rev 133855)
@@ -1242,8 +1242,8 @@
                 "type": "object",
                 "description": "Data entry.",
                 "properties": [
-                    { "name": "key", "$ref": "Key", "description": "Key." },
-                    { "name": "primaryKey", "$ref": "Key", "description": "Primary key." },
+                    { "name": "key", "$ref": "Runtime.RemoteObject", "description": "Key." },
+                    { "name": "primaryKey", "$ref": "Runtime.RemoteObject", "description": "Primary key." },
                     { "name": "value", "$ref": "Runtime.RemoteObject", "description": "Value." }
                 ]
             },

Modified: trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp (133854 => 133855)


--- trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp	2012-11-08 07:29:06 UTC (rev 133854)
+++ trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp	2012-11-08 07:32:34 UTC (rev 133855)
@@ -36,34 +36,33 @@
 
 #include "DOMStringList.h"
 #include "DOMWindow.h"
+#include "DOMWindowIndexedDatabase.h"
 #include "Document.h"
+#include "Event.h"
+#include "EventListener.h"
+#include "EventTarget.h"
 #include "ExceptionCode.h"
 #include "Frame.h"
-#include "GroupSettings.h"
-#include "IDBCallbacks.h"
 #include "IDBCursor.h"
-#include "IDBCursorBackendInterface.h"
-#include "IDBDatabaseBackendInterface.h"
+#include "IDBCursorWithValue.h"
+#include "IDBDatabase.h"
 #include "IDBDatabaseCallbacks.h"
-#include "IDBFactoryBackendInterface.h"
-#include "IDBIndexBackendInterface.h"
+#include "IDBFactory.h"
+#include "IDBIndex.h"
 #include "IDBKey.h"
 #include "IDBKeyPath.h"
 #include "IDBKeyRange.h"
 #include "IDBMetadata.h"
-#include "IDBObjectStoreBackendInterface.h"
-#include "IDBPendingTransactionMonitor.h"
+#include "IDBObjectStore.h"
+#include "IDBOpenDBRequest.h"
+#include "IDBRequest.h"
 #include "IDBTransaction.h"
-#include "IDBTransactionBackendInterface.h"
 #include "InjectedScript.h"
 #include "InspectorFrontend.h"
 #include "InspectorPageAgent.h"
 #include "InspectorState.h"
 #include "InspectorValues.h"
 #include "InstrumentingAgents.h"
-#include "Page.h"
-#include "PageGroup.h"
-#include "PageGroupIndexedDatabase.h"
 #include "SecurityOrigin.h"
 
 #include <wtf/Vector.h>
@@ -81,6 +80,7 @@
 typedef WebCore::InspectorBackendDispatcher::IndexedDBCommandHandler::RequestDatabaseNamesForFrameCallback RequestDatabaseNamesForFrameCallback;
 typedef WebCore::InspectorBackendDispatcher::IndexedDBCommandHandler::RequestDatabaseCallback RequestDatabaseCallback;
 typedef WebCore::InspectorBackendDispatcher::IndexedDBCommandHandler::RequestDataCallback RequestDataCallback;
+typedef WebCore::InspectorBackendDispatcher::CallbackBase RequestCallback;
 
 namespace WebCore {
 
@@ -90,60 +90,9 @@
 
 namespace {
 
-class InspectorIDBCallback : public IDBCallbacks {
+class GetDatabaseNamesCallback : public EventListener {
+    WTF_MAKE_NONCOPYABLE(GetDatabaseNamesCallback);
 public:
-    virtual ~InspectorIDBCallback() { }
-
-    virtual void onError(PassRefPtr<IDBDatabaseError>) OVERRIDE { }
-    virtual void onSuccess(PassRefPtr<DOMStringList>) OVERRIDE { }
-    virtual void onSuccess(PassRefPtr<IDBCursorBackendInterface>, PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SerializedScriptValue>) OVERRIDE { }
-    virtual void onSuccess(PassRefPtr<IDBDatabaseBackendInterface>) OVERRIDE { }
-    virtual void onSuccess(PassRefPtr<IDBKey>) OVERRIDE { }
-    virtual void onSuccess(PassRefPtr<IDBTransactionBackendInterface>) OVERRIDE { }
-    virtual void onSuccess(PassRefPtr<SerializedScriptValue>) OVERRIDE { }
-    virtual void onSuccess(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBKey>, const IDBKeyPath&) OVERRIDE { }
-    virtual void onSuccess(int64_t value) OVERRIDE { return onSuccess(SerializedScriptValue::numberValue(value)); }
-    virtual void onSuccess() OVERRIDE { return onSuccess(SerializedScriptValue::undefinedValue()); }
-    virtual void onSuccess(PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SerializedScriptValue>) OVERRIDE { }
-    virtual void onSuccessWithPrefetch(const Vector<RefPtr<IDBKey> >&, const Vector<RefPtr<IDBKey> >&, const Vector<RefPtr<SerializedScriptValue> >&) OVERRIDE { }
-    virtual void onUpgradeNeeded(int64_t, PassRefPtr<WebCore::IDBTransactionBackendInterface>, PassRefPtr<WebCore::IDBDatabaseBackendInterface>) OVERRIDE { }
-    virtual void onBlocked() OVERRIDE { }
-};
-
-class InspectorIDBDatabaseCallbacks : public IDBDatabaseCallbacks {
-public:
-    static PassRefPtr<InspectorIDBDatabaseCallbacks> create()
-    {
-        return adoptRef(new InspectorIDBDatabaseCallbacks());
-    }
-
-    virtual ~InspectorIDBDatabaseCallbacks() { }
-
-    virtual void onVersionChange(const String& version) { }
-    virtual void onVersionChange(int64_t oldVersion, int64_t newVersion) { }
-    virtual void onForcedClose() { }
-private:
-    InspectorIDBDatabaseCallbacks() { }
-};
-
-
-class InspectorIDBTransactionCallback : public IDBTransactionCallbacks {
-public:
-    static PassRefPtr<InspectorIDBTransactionCallback> create()
-    {
-        return adoptRef(new InspectorIDBTransactionCallback());
-    }
-
-    virtual ~InspectorIDBTransactionCallback() { }
-
-    virtual void onAbort(PassRefPtr<IDBDatabaseError>) { }
-    virtual void onComplete() { }
-private:
-    InspectorIDBTransactionCallback() { }
-};
-
-class GetDatabaseNamesCallback : public InspectorIDBCallback {
-public:
     static PassRefPtr<GetDatabaseNamesCallback> create(PassRefPtr<RequestDatabaseNamesForFrameCallback> requestCallback, const String& securityOrigin)
     {
         return adoptRef(new GetDatabaseNamesCallback(requestCallback, securityOrigin));
@@ -151,11 +100,32 @@
 
     virtual ~GetDatabaseNamesCallback() { }
 
-    virtual void onSuccess(PassRefPtr<DOMStringList> databaseNamesList)
+    virtual bool operator==(const EventListener& other) OVERRIDE
     {
+        return this == &other;
+    }
+
+    virtual void handleEvent(ScriptExecutionContext*, Event* event) OVERRIDE
+    {
         if (!m_requestCallback->isActive())
             return;
+        if (event->type() != eventNames().successEvent) {
+            m_requestCallback->sendFailure("Unexpected event type.");
+            return;
+        }
 
+        IDBRequest* idbRequest = static_cast<IDBRequest*>(event->target());
+        ExceptionCode ec = 0;
+        RefPtr<IDBAny> requestResult = idbRequest->result(ec);
+        if (ec) {
+            m_requestCallback->sendFailure("Could not get result in callback.");
+            return;
+        }
+        if (requestResult->type() != IDBAny::DOMStringListType) {
+            m_requestCallback->sendFailure("Unexpected result type.");
+            return;
+        }
+        RefPtr<DOMStringList> databaseNamesList = requestResult->domStringList();
         RefPtr<TypeBuilder::Array<String> > databaseNames = TypeBuilder::Array<String>::create();
         for (size_t i = 0; i < databaseNamesList->length(); ++i)
             databaseNames->addItem(databaseNamesList->item(i));
@@ -163,48 +133,32 @@
         RefPtr<SecurityOriginWithDatabaseNames> result = SecurityOriginWithDatabaseNames::create()
             .setSecurityOrigin(m_securityOrigin)
             .setDatabaseNames(databaseNames);
-
         m_requestCallback->sendSuccess(result);
     }
 
 private:
     GetDatabaseNamesCallback(PassRefPtr<RequestDatabaseNamesForFrameCallback> requestCallback, const String& securityOrigin)
-        : m_requestCallback(requestCallback)
+        : EventListener(EventListener::CPPEventListenerType)
+        , m_requestCallback(requestCallback)
         , m_securityOrigin(securityOrigin) { }
     RefPtr<RequestDatabaseNamesForFrameCallback> m_requestCallback;
     String m_securityOrigin;
 };
 
-class DatabaseConnection {
-public:
-    DatabaseConnection()
-        : m_idbDatabaseCallbacks(InspectorIDBDatabaseCallbacks::create()) { }
-
-    ~DatabaseConnection()
-    {
-        if (m_idbDatabase)
-            m_idbDatabase->close(m_idbDatabaseCallbacks);
-    }
-
-    void connect(PassRefPtr<IDBDatabaseBackendInterface> database) { m_idbDatabase = database; }
-    PassRefPtr<IDBDatabaseCallbacks> callbacks() { return m_idbDatabaseCallbacks; }
-
-private:
-    RefPtr<IDBDatabaseBackendInterface> m_idbDatabase;
-    RefPtr<IDBDatabaseCallbacks> m_idbDatabaseCallbacks;
-};
-
 class ExecutableWithDatabase : public RefCounted<ExecutableWithDatabase> {
 public:
+    ExecutableWithDatabase(ScriptExecutionContext* context)
+        : m_context(context) { }
     virtual ~ExecutableWithDatabase() { };
-    void start(IDBFactoryBackendInterface*, SecurityOrigin*, ScriptExecutionContext*, const String& databaseName);
-    void connect(PassRefPtr<IDBDatabaseBackendInterface> database) { m_connection.connect(database); }
-    virtual void execute(PassRefPtr<IDBDatabaseBackendInterface>) = 0;
+    void start(IDBFactory*, SecurityOrigin*, const String& databaseName);
+    virtual void execute(PassRefPtr<IDBDatabase>) = 0;
+    virtual RequestCallback* requestCallback() = 0;
+    ScriptExecutionContext* context() { return m_context; };
 private:
-    DatabaseConnection m_connection;
+    ScriptExecutionContext* m_context;
 };
 
-class OpenDatabaseCallback : public InspectorIDBCallback {
+class OpenDatabaseCallback : public EventListener {
 public:
     static PassRefPtr<OpenDatabaseCallback> create(ExecutableWithDatabase* executableWithDatabase)
     {
@@ -213,49 +167,76 @@
 
     virtual ~OpenDatabaseCallback() { }
 
-    virtual void onSuccess(PassRefPtr<IDBDatabaseBackendInterface> prpDatabase)
+    virtual bool operator==(const EventListener& other) OVERRIDE
     {
-        RefPtr<IDBDatabaseBackendInterface> idbDatabase = prpDatabase;
-        m_executableWithDatabase->connect(idbDatabase);
+        return this == &other;
+    }
+
+    virtual void handleEvent(ScriptExecutionContext*, Event* event) OVERRIDE
+    {
+        if (event->type() != eventNames().successEvent) {
+            m_executableWithDatabase->requestCallback()->sendFailure("Unexpected event type.");
+            return;
+        }
+
+        IDBOpenDBRequest* idbOpenDBRequest = static_cast<IDBOpenDBRequest*>(event->target());
+        ExceptionCode ec = 0;
+        RefPtr<IDBAny> requestResult = idbOpenDBRequest->result(ec);
+        if (ec) {
+            m_executableWithDatabase->requestCallback()->sendFailure("Could not get result in callback.");
+            return;
+        }
+        if (requestResult->type() != IDBAny::IDBDatabaseType) {
+            m_executableWithDatabase->requestCallback()->sendFailure("Unexpected result type.");
+            return;
+        }
+
+        RefPtr<IDBDatabase> idbDatabase = requestResult->idbDatabase();
         m_executableWithDatabase->execute(idbDatabase);
+        idbDatabase->close();
     }
 
 private:
     OpenDatabaseCallback(ExecutableWithDatabase* executableWithDatabase)
-        : m_executableWithDatabase(executableWithDatabase) { }
+        : EventListener(EventListener::CPPEventListenerType)
+        , m_executableWithDatabase(executableWithDatabase) { }
     RefPtr<ExecutableWithDatabase> m_executableWithDatabase;
 };
 
-void ExecutableWithDatabase::start(IDBFactoryBackendInterface* idbFactory, SecurityOrigin* securityOrigin, ScriptExecutionContext* context, const String& databaseName)
+void ExecutableWithDatabase::start(IDBFactory* idbFactory, SecurityOrigin* securityOrigin, const String& databaseName)
 {
     RefPtr<OpenDatabaseCallback> callback = OpenDatabaseCallback::create(this);
-    idbFactory->open(databaseName, IDBDatabaseMetadata::NoIntVersion, callback, m_connection.callbacks(), securityOrigin, context, String());
+    ExceptionCode ec = 0;
+    RefPtr<IDBOpenDBRequest> idbOpenDBRequest = idbFactory->open(context(), databaseName, ec);
+    if (ec) {
+        requestCallback()->sendFailure("Could not open database.");
+        return;
+    }
+    idbOpenDBRequest->addEventListener(eventNames().successEvent, callback, false);
 }
 
-static PassRefPtr<IDBTransactionBackendInterface> transactionForDatabase(IDBDatabaseBackendInterface* idbDatabase, const String& objectStoreName)
+static PassRefPtr<IDBTransaction> transactionForDatabase(ScriptExecutionContext* scriptExecutionContext, IDBDatabase* idbDatabase, const String& objectStoreName)
 {
     ExceptionCode ec = 0;
-    RefPtr<DOMStringList> transactionObjectStoreNamesList = DOMStringList::create();
-    transactionObjectStoreNamesList->append(objectStoreName);
-    RefPtr<IDBTransactionBackendInterface> idbTransaction = idbDatabase->transaction(transactionObjectStoreNamesList.get(), IDBTransaction::READ_ONLY, ec);
+    RefPtr<IDBTransaction> idbTransaction = idbDatabase->transaction(scriptExecutionContext, objectStoreName, IDBTransaction::modeReadOnly(), ec);
     if (ec)
         return 0;
     return idbTransaction;
 }
 
-static PassRefPtr<IDBObjectStoreBackendInterface> objectStoreForTransaction(IDBTransactionBackendInterface* idbTransaction, const String& objectStoreName)
+static PassRefPtr<IDBObjectStore> objectStoreForTransaction(IDBTransaction* idbTransaction, const String& objectStoreName)
 {
     ExceptionCode ec = 0;
-    RefPtr<IDBObjectStoreBackendInterface> idbObjectStore = idbTransaction->objectStore(objectStoreName, ec);
+    RefPtr<IDBObjectStore> idbObjectStore = idbTransaction->objectStore(objectStoreName, ec);
     if (ec)
         return 0;
     return idbObjectStore;
 }
 
-static PassRefPtr<IDBIndexBackendInterface> indexForObjectStore(IDBObjectStoreBackendInterface* idbObjectStore, const String& indexName)
+static PassRefPtr<IDBIndex> indexForObjectStore(IDBObjectStore* idbObjectStore, const String& indexName)
 {
     ExceptionCode ec = 0;
-    RefPtr<IDBIndexBackendInterface> idbIndex = idbObjectStore->index(indexName, ec);
+    RefPtr<IDBIndex> idbIndex = idbObjectStore->index(indexName, ec);
     if (ec)
         return 0;
     return idbIndex;
@@ -288,19 +269,19 @@
     return keyPath.release();
 }
 
-class DatabaseLoaderCallback : public ExecutableWithDatabase {
+class DatabaseLoader : public ExecutableWithDatabase {
 public:
-    static PassRefPtr<DatabaseLoaderCallback> create(PassRefPtr<RequestDatabaseCallback> requestCallback)
+    static PassRefPtr<DatabaseLoader> create(ScriptExecutionContext* context, PassRefPtr<RequestDatabaseCallback> requestCallback)
     {
-        return adoptRef(new DatabaseLoaderCallback(requestCallback));
+        return adoptRef(new DatabaseLoader(context, requestCallback));
     }
 
-    virtual ~DatabaseLoaderCallback() { }
+    virtual ~DatabaseLoader() { }
 
-    virtual void execute(PassRefPtr<IDBDatabaseBackendInterface> prpDatabase)
+    virtual void execute(PassRefPtr<IDBDatabase> prpDatabase)
     {
-        RefPtr<IDBDatabaseBackendInterface> idbDatabase = prpDatabase;
-        if (!m_requestCallback->isActive())
+        RefPtr<IDBDatabase> idbDatabase = prpDatabase;
+        if (!requestCallback()->isActive())
             return;
 
         const IDBDatabaseMetadata databaseMetadata = idbDatabase->metadata();
@@ -339,9 +320,11 @@
         m_requestCallback->sendSuccess(result);
     }
 
+    virtual RequestCallback* requestCallback() { return m_requestCallback.get(); }
 private:
-    DatabaseLoaderCallback(PassRefPtr<RequestDatabaseCallback> requestCallback)
-        : m_requestCallback(requestCallback) { }
+    DatabaseLoader(ScriptExecutionContext* context, PassRefPtr<RequestDatabaseCallback> requestCallback)
+        : ExecutableWithDatabase(context)
+        , m_requestCallback(requestCallback) { }
     RefPtr<RequestDatabaseCallback> m_requestCallback;
 };
 
@@ -416,75 +399,53 @@
     return idbKeyRange.release();
 }
 
-static PassRefPtr<Key> keyFromIDBKey(IDBKey* idbKey)
-{
-    if (!idbKey || !idbKey->isValid())
-        return 0;
+class DataLoader;
 
-    RefPtr<Key> key;
-    switch (idbKey->type()) {
-    case IDBKey::InvalidType:
-    case IDBKey::MinType:
-        return 0;
-    case IDBKey::NumberType: {
-        RefPtr<Key> tmpKey = Key::create().setType(Key::Type::Number);
-        key = tmpKey;
-        key->setNumber(idbKey->number());
-        break;
-    }
-    case IDBKey::StringType: {
-        RefPtr<Key> tmpKey = Key::create().setType(Key::Type::String);
-        key = tmpKey;
-        key->setString(idbKey->string());
-        break;
-    }
-    case IDBKey::DateType: {
-        RefPtr<Key> tmpKey = Key::create().setType(Key::Type::Date);
-        key = tmpKey;
-        key->setDate(idbKey->date());
-        break;
-    }
-    case IDBKey::ArrayType: {
-        RefPtr<Key> tmpKey = Key::create().setType(Key::Type::Array);
-        key = tmpKey;
-        RefPtr<TypeBuilder::Array<TypeBuilder::IndexedDB::Key> > array = TypeBuilder::Array<TypeBuilder::IndexedDB::Key>::create();
-        IDBKey::KeyArray keyArray = idbKey->array();
-        for (size_t i = 0; i < keyArray.size(); ++i)
-            array->addItem(keyFromIDBKey(keyArray[i].get()));
-        key->setArray(array);
-        break;
-    }
-    }
-    return key.release();
-}
-
-class DataLoaderCallback;
-
-class OpenCursorCallback : public InspectorIDBCallback {
+class OpenCursorCallback : public EventListener {
 public:
-    static PassRefPtr<OpenCursorCallback> create(InjectedScript injectedScript, PassRefPtr<DataLoaderCallback> dataLoaderCallback, PassRefPtr<IDBTransactionBackendInterface> idbTransaction, PassRefPtr<RequestDataCallback> requestCallback, int skipCount, unsigned pageSize)
+    static PassRefPtr<OpenCursorCallback> create(InjectedScript injectedScript, PassRefPtr<RequestDataCallback> requestCallback, int skipCount, unsigned pageSize)
     {
-        return adoptRef(new OpenCursorCallback(injectedScript, dataLoaderCallback, idbTransaction, requestCallback, skipCount, pageSize));
+        return adoptRef(new OpenCursorCallback(injectedScript, requestCallback, skipCount, pageSize));
     }
 
     virtual ~OpenCursorCallback() { }
 
-    virtual void onSuccess(PassRefPtr<SerializedScriptValue>)
+    virtual bool operator==(const EventListener& other) OVERRIDE
     {
-        end(false);
+        return this == &other;
     }
 
-    virtual void onSuccess(PassRefPtr<IDBCursorBackendInterface> idbCursor, PassRefPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SerializedScriptValue> value)
+    virtual void handleEvent(ScriptExecutionContext*, Event* event) OVERRIDE
     {
-        m_idbCursor = idbCursor;
-        onSuccess(key, primaryKey, value);
-    }
+        if (event->type() != eventNames().successEvent) {
+            m_requestCallback->sendFailure("Unexpected event type.");
+            return;
+        }
 
-    virtual void onSuccess(PassRefPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SerializedScriptValue> value)
-    {
+        IDBRequest* idbRequest = static_cast<IDBRequest*>(event->target());
+        ExceptionCode ec = 0;
+        RefPtr<IDBAny> requestResult = idbRequest->result(ec);
+        if (ec) {
+            m_requestCallback->sendFailure("Could not get result in callback.");
+            return;
+        }
+        if (requestResult->type() == IDBAny::ScriptValueType) {
+            end(false);
+            return;
+        }
+        if (requestResult->type() != IDBAny::IDBCursorWithValueType) {
+            m_requestCallback->sendFailure("Unexpected result type.");
+            return;
+        }
+
+        RefPtr<IDBCursorWithValue> idbCursor = requestResult->idbCursorWithValue();
+
         if (m_skipCount) {
-            --m_skipCount;
-            next();
+            ExceptionCode ec = 0;
+            idbCursor->advance(m_skipCount, ec);
+            if (ec)
+                m_requestCallback->sendFailure("Could not advance cursor.");
+            m_skipCount = 0;
             return;
         }
 
@@ -493,99 +454,91 @@
             return;
         }
 
-        RefPtr<TypeBuilder::Runtime::RemoteObject> wrappedValue = m_injectedScript.wrapSerializedObject(value.get(), String());
+        // Continue cursor before making injected script calls, otherwise transaction might be finished.
+        idbCursor->continueFunction(0, ec);
+        if (ec) {
+            m_requestCallback->sendFailure("Could not continue cursor.");
+            return;
+        }
+
         RefPtr<DataEntry> dataEntry = DataEntry::create()
-            .setKey(keyFromIDBKey(key.get()))
-            .setPrimaryKey(keyFromIDBKey(primaryKey.get()))
-            .setValue(wrappedValue);
+            .setKey(m_injectedScript.wrapObject(idbCursor->key(), String()))
+            .setPrimaryKey(m_injectedScript.wrapObject(idbCursor->primaryKey(), String()))
+            .setValue(m_injectedScript.wrapObject(idbCursor->value(), String()));
         m_result->addItem(dataEntry);
 
-        next();
     }
 
-    void next()
-    {
-        ExceptionCode ec = 0;
-        m_idbCursor->continueFunction(0, this, ec);
-        m_idbCursor->postSuccessHandlerCallback();
-        m_idbTransaction->didCompleteTaskEvents();
-    }
-
     void end(bool hasMore)
     {
-        m_dataLoaderCallback.clear();
         if (!m_requestCallback->isActive())
             return;
-
-        if (m_idbCursor)
-            m_idbCursor->postSuccessHandlerCallback();
-        m_idbTransaction->didCompleteTaskEvents();
-
         m_requestCallback->sendSuccess(m_result.release(), hasMore);
     }
 
 private:
-    OpenCursorCallback(InjectedScript injectedScript, PassRefPtr<DataLoaderCallback> dataLoaderCallback, PassRefPtr<IDBTransactionBackendInterface> idbTransaction, PassRefPtr<RequestDataCallback> requestCallback, int skipCount, unsigned pageSize)
-        : m_injectedScript(injectedScript)
-        , m_dataLoaderCallback(dataLoaderCallback)
-        , m_idbTransaction(idbTransaction)
+    OpenCursorCallback(InjectedScript injectedScript, PassRefPtr<RequestDataCallback> requestCallback, int skipCount, unsigned pageSize)
+        : EventListener(EventListener::CPPEventListenerType)
+        , m_injectedScript(injectedScript)
         , m_requestCallback(requestCallback)
         , m_skipCount(skipCount)
         , m_pageSize(pageSize)
     {
         m_result = Array<DataEntry>::create();
-        m_idbTransaction->setCallbacks(InspectorIDBTransactionCallback::create().get());
     }
     InjectedScript m_injectedScript;
-    RefPtr<DataLoaderCallback> m_dataLoaderCallback;
-    RefPtr<IDBTransactionBackendInterface> m_idbTransaction;
     RefPtr<RequestDataCallback> m_requestCallback;
     int m_skipCount;
     unsigned m_pageSize;
     RefPtr<Array<DataEntry> > m_result;
-    RefPtr<IDBCursorBackendInterface> m_idbCursor;
 };
 
-class DataLoaderCallback : public ExecutableWithDatabase {
+class DataLoader : public ExecutableWithDatabase {
 public:
-    static PassRefPtr<DataLoaderCallback> create(PassRefPtr<RequestDataCallback> requestCallback, const InjectedScript& injectedScript, const String& objectStoreName, const String& indexName, PassRefPtr<IDBKeyRange> idbKeyRange, int skipCount, unsigned pageSize)
+    static PassRefPtr<DataLoader> create(ScriptExecutionContext* context, PassRefPtr<RequestDataCallback> requestCallback, const InjectedScript& injectedScript, const String& objectStoreName, const String& indexName, PassRefPtr<IDBKeyRange> idbKeyRange, int skipCount, unsigned pageSize)
     {
-        return adoptRef(new DataLoaderCallback(requestCallback, injectedScript, objectStoreName, indexName, idbKeyRange, skipCount, pageSize));
+        return adoptRef(new DataLoader(context, requestCallback, injectedScript, objectStoreName, indexName, idbKeyRange, skipCount, pageSize));
     }
 
-    virtual ~DataLoaderCallback() { }
+    virtual ~DataLoader() { }
 
-    virtual void execute(PassRefPtr<IDBDatabaseBackendInterface> prpDatabase)
+    virtual void execute(PassRefPtr<IDBDatabase> prpDatabase)
     {
-        RefPtr<IDBDatabaseBackendInterface> idbDatabase = prpDatabase;
-        if (!m_requestCallback->isActive())
+        RefPtr<IDBDatabase> idbDatabase = prpDatabase;
+        if (!requestCallback()->isActive())
             return;
-
-        RefPtr<IDBTransactionBackendInterface> idbTransaction = transactionForDatabase(idbDatabase.get(), m_objectStoreName);
-        if (!idbTransaction)
+        RefPtr<IDBTransaction> idbTransaction = transactionForDatabase(context(), idbDatabase.get(), m_objectStoreName);
+        if (!idbTransaction) {
+            m_requestCallback->sendFailure("Could not get transaction");
             return;
-        RefPtr<IDBObjectStoreBackendInterface> idbObjectStore = objectStoreForTransaction(idbTransaction.get(), m_objectStoreName);
-        if (!idbObjectStore)
+        }
+        RefPtr<IDBObjectStore> idbObjectStore = objectStoreForTransaction(idbTransaction.get(), m_objectStoreName);
+        if (!idbObjectStore) {
+            m_requestCallback->sendFailure("Could not get object store");
             return;
+        }
 
-        RefPtr<OpenCursorCallback> openCursorCallback = OpenCursorCallback::create(m_injectedScript, this, idbTransaction.get(), m_requestCallback, m_skipCount, m_pageSize);
+        RefPtr<OpenCursorCallback> openCursorCallback = OpenCursorCallback::create(m_injectedScript, m_requestCallback, m_skipCount, m_pageSize);
 
+        ExceptionCode ec = 0;
+        RefPtr<IDBRequest> idbRequest;
         if (!m_indexName.isEmpty()) {
-            RefPtr<IDBIndexBackendInterface> idbIndex = indexForObjectStore(idbObjectStore.get(), m_indexName);
-            if (!idbIndex)
+            RefPtr<IDBIndex> idbIndex = indexForObjectStore(idbObjectStore.get(), m_indexName);
+            if (!idbIndex) {
+                m_requestCallback->sendFailure("Could not get index");
                 return;
+            }
 
-            ExceptionCode ec = 0;
-            idbIndex->openCursor(m_idbKeyRange, IDBCursor::NEXT, openCursorCallback, idbTransaction.get(), ec);
-        } else {
-            ExceptionCode ec = 0;
-            idbObjectStore->openCursor(m_idbKeyRange, IDBCursor::NEXT, openCursorCallback, IDBTransactionBackendInterface::NormalTask, idbTransaction.get(), ec);
-        }
+            idbRequest = idbIndex->openCursor(context(), PassRefPtr<IDBKeyRange>(m_idbKeyRange), ec);
+        } else
+            idbRequest = idbObjectStore->openCursor(context(), PassRefPtr<IDBKeyRange>(m_idbKeyRange), ec);
+        idbRequest->addEventListener(eventNames().successEvent, openCursorCallback, false);
     }
 
-private:
-    DataLoaderCallback(PassRefPtr<RequestDataCallback> requestCallback, const InjectedScript& injectedScript, const String& objectStoreName, const String& indexName, PassRefPtr<IDBKeyRange> idbKeyRange, int skipCount, unsigned pageSize)
-        : m_requestCallback(requestCallback)
+    virtual RequestCallback* requestCallback() { return m_requestCallback.get(); }
+    DataLoader(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<RequestDataCallback> requestCallback, const InjectedScript& injectedScript, const String& objectStoreName, const String& indexName, PassRefPtr<IDBKeyRange> idbKeyRange, int skipCount, unsigned pageSize)
+        : ExecutableWithDatabase(scriptExecutionContext)
+        , m_requestCallback(requestCallback)
         , m_injectedScript(injectedScript)
         , m_objectStoreName(objectStoreName)
         , m_indexName(indexName)
@@ -668,10 +621,14 @@
     return document;
 }
 
-static IDBFactoryBackendInterface* assertIDBFactory(ErrorString* errorString, Document* document)
+static IDBFactory* assertIDBFactory(ErrorString* errorString, Document* document)
 {
-    Page* page = document ? document->page() : 0;
-    IDBFactoryBackendInterface* idbFactory = page ? PageGroupIndexedDatabase::from(page->group())->factoryBackend() : 0;
+    DOMWindow* domWindow = document->domWindow();
+    if (!domWindow) {
+        *errorString = "No IndexedDB factory for given frame found";
+        return 0;
+    }
+    IDBFactory* idbFactory = DOMWindowIndexedDatabase::indexedDB(domWindow);
 
     if (!idbFactory)
         *errorString = "No IndexedDB factory for given frame found";
@@ -684,13 +641,11 @@
     Document* document = assertDocument(errorString, frameId, m_pageAgent);
     if (!document)
         return;
-    IDBFactoryBackendInterface* idbFactory = assertIDBFactory(errorString, document);
+    IDBFactory* idbFactory = assertIDBFactory(errorString, document);
     if (!idbFactory)
         return;
-
-    RefPtr<GetDatabaseNamesCallback> callback = GetDatabaseNamesCallback::create(requestCallback, document->securityOrigin()->toString());
-    GroupSettings* groupSettings = document->page()->group().groupSettings();
-    idbFactory->getDatabaseNames(callback.get(), document->securityOrigin(), document, groupSettings->indexedDBDatabasePath());
+    RefPtr<IDBRequest> idbRequest = idbFactory->getDatabaseNames(document);
+    idbRequest->addEventListener(eventNames().successEvent, GetDatabaseNamesCallback::create(requestCallback, document->securityOrigin()->toString()), false);
 }
 
 void InspectorIndexedDBAgent::requestDatabase(ErrorString* errorString, const String& frameId, const String& databaseName, PassRefPtr<RequestDatabaseCallback> requestCallback)
@@ -698,12 +653,12 @@
     Document* document = assertDocument(errorString, frameId, m_pageAgent);
     if (!document)
         return;
-    IDBFactoryBackendInterface* idbFactory = assertIDBFactory(errorString, document);
+    IDBFactory* idbFactory = assertIDBFactory(errorString, document);
     if (!idbFactory)
         return;
 
-    RefPtr<DatabaseLoaderCallback> databaseLoaderCallback = DatabaseLoaderCallback::create(requestCallback);
-    databaseLoaderCallback->start(idbFactory, document->securityOrigin(), document, databaseName);
+    RefPtr<DatabaseLoader> databaseLoader = DatabaseLoader::create(document, requestCallback);
+    databaseLoader->start(idbFactory, document->securityOrigin(), databaseName);
 }
 
 void InspectorIndexedDBAgent::requestData(ErrorString* errorString, const String& frameId, const String& databaseName, const String& objectStoreName, const String& indexName, int skipCount, int pageSize, const RefPtr<InspectorObject>* keyRange, PassRefPtr<RequestDataCallback> requestCallback)
@@ -714,7 +669,7 @@
     Document* document = assertDocument(errorString, frame);
     if (!document)
         return;
-    IDBFactoryBackendInterface* idbFactory = assertIDBFactory(errorString, document);
+    IDBFactory* idbFactory = assertIDBFactory(errorString, document);
     if (!idbFactory)
         return;
 
@@ -726,8 +681,8 @@
         return;
     }
 
-    RefPtr<DataLoaderCallback> dataLoaderCallback = DataLoaderCallback::create(requestCallback, injectedScript, objectStoreName, indexName, idbKeyRange, skipCount, pageSize);
-    dataLoaderCallback->start(idbFactory, document->securityOrigin(), document, databaseName);
+    RefPtr<DataLoader> dataLoader = DataLoader::create(document, requestCallback, injectedScript, objectStoreName, indexName, idbKeyRange, skipCount, pageSize);
+    dataLoader->start(idbFactory, document->securityOrigin(), databaseName);
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/inspector/front-end/IndexedDBModel.js (133854 => 133855)


--- trunk/Source/WebCore/inspector/front-end/IndexedDBModel.js	2012-11-08 07:29:06 UTC (rev 133854)
+++ trunk/Source/WebCore/inspector/front-end/IndexedDBModel.js	2012-11-08 07:32:34 UTC (rev 133855)
@@ -61,31 +61,6 @@
     ArrayType:   "array"
 };
 
-/**
- * @param {IndexedDBAgent.Key} key
- */
-WebInspector.IndexedDBModel.idbKeyFromKey = function(key)
-{
-    var idbKey;
-    switch (key.type) {
-    case WebInspector.IndexedDBModel.KeyTypes.NumberType:
-        idbKey = key.number;
-        break;
-    case WebInspector.IndexedDBModel.KeyTypes.StringType:
-        idbKey = key.string;
-        break;
-    case WebInspector.IndexedDBModel.KeyTypes.DateType:
-        idbKey = new Date(key.date);
-        break;
-    case WebInspector.IndexedDBModel.KeyTypes.ArrayType:
-        idbKey = [];
-        for (var i = 0; i < key.array.length; ++i)
-            idbKey.push(WebInspector.IndexedDBModel.idbKeyFromKey(key.array[i]));
-        break;
-    }
-    return idbKey;
-}
-
 WebInspector.IndexedDBModel.keyFromIDBKey = function(idbKey)
 {
     if (typeof(idbKey) === "undefined" || idbKey === null)
@@ -473,8 +448,8 @@
 
             var entries = [];
             for (var i = 0; i < dataEntries.length; ++i) {
-                var key = WebInspector.IndexedDBModel.idbKeyFromKey(dataEntries[i].key);
-                var primaryKey = WebInspector.IndexedDBModel.idbKeyFromKey(dataEntries[i].primaryKey);
+                var key = WebInspector.RemoteObject.fromPayload(dataEntries[i].key);
+                var primaryKey = WebInspector.RemoteObject.fromPayload(dataEntries[i].primaryKey);
                 var value = WebInspector.RemoteObject.fromPayload(dataEntries[i].value);
                 entries.push(new WebInspector.IndexedDBModel.Entry(key, primaryKey, value));
             }
@@ -490,8 +465,8 @@
 
 /**
  * @constructor
- * @param {*} key
- * @param {*} primaryKey
+ * @param {WebInspector.RemoteObject} key
+ * @param {WebInspector.RemoteObject} primaryKey
  * @param {WebInspector.RemoteObject} value
  */
 WebInspector.IndexedDBModel.Entry = function(key, primaryKey, value)

Modified: trunk/Source/WebCore/inspector/front-end/IndexedDBViews.js (133854 => 133855)


--- trunk/Source/WebCore/inspector/front-end/IndexedDBViews.js	2012-11-08 07:29:06 UTC (rev 133854)
+++ trunk/Source/WebCore/inspector/front-end/IndexedDBViews.js	2012-11-08 07:32:34 UTC (rev 133855)
@@ -334,8 +334,7 @@
                 data["value"] = entries[i].value;
 
                 var primaryKey = JSON.stringify(this._isIndex ? entries[i].primaryKey : entries[i].key);
-                var valueTitle = this._objectStore.name + "[" + primaryKey + "]";
-                var node = new WebInspector.IDBDataGridNode(valueTitle, data);
+                var node = new WebInspector.IDBDataGridNode(data);
                 this._dataGrid.rootNode().appendChild(node);
             }
 
@@ -376,14 +375,11 @@
 /**
  * @constructor
  * @extends {WebInspector.DataGridNode}
- * @param {string} valueTitle
  * @param {*} data
  */
-WebInspector.IDBDataGridNode = function(valueTitle, data)
+WebInspector.IDBDataGridNode = function(data)
 {
     WebInspector.DataGridNode.call(this, data, false);
-
-    this._valueTitle = valueTitle;
     this.selectable = false;
 }
 
@@ -398,13 +394,10 @@
 
         switch (columnIdentifier) {
         case "value":
-            cell.removeChildren();
-            this._formatValue(cell, value);
-            break;
         case "key":
         case "primaryKey":
             cell.removeChildren();
-            this._formatValue(cell, new WebInspector.LocalJSONObject(value));
+            this._formatValue(cell, value);
             break;
         default:
         }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to