Title: [105864] trunk/Source/WebCore
Revision
105864
Author
[email protected]
Date
2012-01-25 04:01:49 -0800 (Wed, 25 Jan 2012)

Log Message

Web Inspector: [InspectorIndexedDB] Pass Database, object stores and indexes meta information to frontend.
https://bugs.webkit.org/show_bug.cgi?id=76711

Reviewed by Yury Semikhatsky.

* inspector/Inspector.json:
* inspector/InspectorIndexedDBAgent.cpp:
(WebCore):
(WebCore::assertDocument):
(WebCore::assertIDBFactory):
(WebCore::InspectorIndexedDBAgent::requestDatabaseNamesForFrame):
(WebCore::InspectorIndexedDBAgent::requestDatabase):
* inspector/InspectorIndexedDBAgent.h:
(InspectorIndexedDBAgent):
* inspector/front-end/IndexedDBModel.js:
(WebInspector.IndexedDBModel):
(WebInspector.IndexedDBModel.prototype._frameDetached):
(WebInspector.IndexedDBModel.prototype._reset):
(WebInspector.IndexedDBModel.prototype._originAddedToFrame):
(WebInspector.IndexedDBModel.prototype._originRemovedFromFrame):
(WebInspector.IndexedDBModel.prototype._originRemoved):
(WebInspector.IndexedDBModel.prototype._updateOriginDatabaseNames):
(WebInspector.IndexedDBModel.prototype._databaseRemoved):
(WebInspector.IndexedDBModel.prototype._loadDatabaseNamesForFrame):
(WebInspector.IndexedDBModel.prototype._loadDatabase):
(WebInspector.IndexedDBModel.Frame):
(WebInspector.IndexedDBModel.Database):
(WebInspector.IndexedDBModel.ObjectStore):
(WebInspector.IndexedDBModel.ObjectStoreIndex):
(WebInspector.IndexedDBRequestManager.prototype._databaseNamesLoaded):
(WebInspector.IndexedDBRequestManager.prototype.requestDatabase.innerCallback):
(WebInspector.IndexedDBRequestManager.prototype.requestDatabase):
(WebInspector.IndexedDBRequestManager.prototype._databaseLoaded):
(WebInspector.IndexedDBRequestManager.prototype._frameDetached):
(WebInspector.IndexedDBRequestManager.prototype._databaseRemoved):
(WebInspector.IndexedDBRequestManager.prototype._reset):
(WebInspector.IndexedDBRequestManager.DatabaseRequest):
(WebInspector.IndexedDBDispatcher.prototype.databaseNamesLoaded):
(WebInspector.IndexedDBDispatcher.prototype.databaseLoaded):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (105863 => 105864)


--- trunk/Source/WebCore/ChangeLog	2012-01-25 11:54:51 UTC (rev 105863)
+++ trunk/Source/WebCore/ChangeLog	2012-01-25 12:01:49 UTC (rev 105864)
@@ -1,3 +1,45 @@
+2012-01-25  Vsevolod Vlasov  <[email protected]>
+
+        Web Inspector: [InspectorIndexedDB] Pass Database, object stores and indexes meta information to frontend.
+        https://bugs.webkit.org/show_bug.cgi?id=76711
+
+        Reviewed by Yury Semikhatsky.
+
+        * inspector/Inspector.json:
+        * inspector/InspectorIndexedDBAgent.cpp:
+        (WebCore):
+        (WebCore::assertDocument):
+        (WebCore::assertIDBFactory):
+        (WebCore::InspectorIndexedDBAgent::requestDatabaseNamesForFrame):
+        (WebCore::InspectorIndexedDBAgent::requestDatabase):
+        * inspector/InspectorIndexedDBAgent.h:
+        (InspectorIndexedDBAgent):
+        * inspector/front-end/IndexedDBModel.js:
+        (WebInspector.IndexedDBModel):
+        (WebInspector.IndexedDBModel.prototype._frameDetached):
+        (WebInspector.IndexedDBModel.prototype._reset):
+        (WebInspector.IndexedDBModel.prototype._originAddedToFrame):
+        (WebInspector.IndexedDBModel.prototype._originRemovedFromFrame):
+        (WebInspector.IndexedDBModel.prototype._originRemoved):
+        (WebInspector.IndexedDBModel.prototype._updateOriginDatabaseNames):
+        (WebInspector.IndexedDBModel.prototype._databaseRemoved):
+        (WebInspector.IndexedDBModel.prototype._loadDatabaseNamesForFrame):
+        (WebInspector.IndexedDBModel.prototype._loadDatabase):
+        (WebInspector.IndexedDBModel.Frame):
+        (WebInspector.IndexedDBModel.Database):
+        (WebInspector.IndexedDBModel.ObjectStore):
+        (WebInspector.IndexedDBModel.ObjectStoreIndex):
+        (WebInspector.IndexedDBRequestManager.prototype._databaseNamesLoaded):
+        (WebInspector.IndexedDBRequestManager.prototype.requestDatabase.innerCallback):
+        (WebInspector.IndexedDBRequestManager.prototype.requestDatabase):
+        (WebInspector.IndexedDBRequestManager.prototype._databaseLoaded):
+        (WebInspector.IndexedDBRequestManager.prototype._frameDetached):
+        (WebInspector.IndexedDBRequestManager.prototype._databaseRemoved):
+        (WebInspector.IndexedDBRequestManager.prototype._reset):
+        (WebInspector.IndexedDBRequestManager.DatabaseRequest):
+        (WebInspector.IndexedDBDispatcher.prototype.databaseNamesLoaded):
+        (WebInspector.IndexedDBDispatcher.prototype.databaseLoaded):
+
 2012-01-25  Peter Rybin  <[email protected]>
 
         Web Inspector: CodeGeneratorInspector.py: add optional runtime validator

Modified: trunk/Source/WebCore/inspector/Inspector.json (105863 => 105864)


--- trunk/Source/WebCore/inspector/Inspector.json	2012-01-25 11:54:51 UTC (rev 105863)
+++ trunk/Source/WebCore/inspector/Inspector.json	2012-01-25 12:01:49 UTC (rev 105864)
@@ -940,6 +940,37 @@
                     { "name": "securityOrigin", "type": "string", "description": "Security origin." },
                     { "name": "databaseNames", "type": "array", "items": { "type": "string" }, "description": "Database names for this origin." }
                 ]
+            },
+            {
+                "id": "DatabaseWithObjectStores",
+                "type": "object",
+                "description": "Database with an array of object stores.",
+                "properties": [
+                    { "name": "name", "type": "string", "description": "Database name." },
+                    { "name": "version", "type": "string", "description": "Database version." },
+                    { "name": "objectStores", "type": "array", "items": { "$ref": "ObjectStore" }, "description": "Object stores in this database." }
+                ]
+            },
+            {
+                "id": "ObjectStore",
+                "type": "object",
+                "description": "Object store.",
+                "properties": [
+                    { "name": "name", "type": "string", "description": "Object store name." },
+                    { "name": "keyPath", "type": "string", "description": "Object store key path." },
+                    { "name": "indexes", "type": "array", "items": { "$ref": "ObjectStoreIndex" }, "description": "Indexes in this object store." }
+                ]
+            },
+            {
+                "id": "ObjectStoreIndex",
+                "type": "object",
+                "description": "Object store index.",
+                "properties": [
+                    { "name": "name", "type": "string", "description": "Index name." },
+                    { "name": "keyPath", "type": "string", "description": "Index key path." },
+                    { "name": "unique", "type": "boolean", "description": "If true, index is unique." },
+                    { "name": "multiEntry", "type": "boolean", "description": "If true, index allows multiple entries for a key." }
+                ]
             }
         ],
         "commands": [
@@ -958,6 +989,15 @@
                     { "name": "frameId", "$ref": "Network.FrameId", "description": "Frame id." }
                 ],
                 "description": "Requests database names for given frame's security origin."
+            },
+            {
+                "name": "requestDatabase",
+                "parameters": [
+                    { "name": "requestId", "type": "integer", "description": "Request id." },
+                    { "name": "frameId", "$ref": "Network.FrameId" },
+                    { "name": "databaseName", "type": "string" }
+                ],
+                "description": "Requests database with given name in given frame."
             }
         ],
         "events": [
@@ -967,6 +1007,13 @@
                     { "name": "requestId", "type": "number", "description": "Request id." },
                     { "name": "securityOriginWithDatabaseNames", "$ref": "SecurityOriginWithDatabaseNames", "description": "Frame with database names." }
                 ]
+            },
+            {
+                "name": "databaseLoaded",
+                "parameters": [
+                    { "name": "requestId", "type": "integer", "description": "Request id." },
+                    { "name": "databaseWithObjectStores", "$ref": "DatabaseWithObjectStores", "description": "Database with an array of object stores." }
+                ]
             }
         ]
     },

Modified: trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp (105863 => 105864)


--- trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp	2012-01-25 11:54:51 UTC (rev 105863)
+++ trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp	2012-01-25 12:01:49 UTC (rev 105864)
@@ -40,7 +40,12 @@
 #include "Frame.h"
 #include "GroupSettings.h"
 #include "IDBCallbacks.h"
+#include "IDBDatabaseBackendInterface.h"
 #include "IDBFactoryBackendInterface.h"
+#include "IDBIndexBackendInterface.h"
+#include "IDBObjectStoreBackendInterface.h"
+#include "IDBTransaction.h"
+#include "IDBTransactionBackendInterface.h"
 #include "InspectorFrontend.h"
 #include "InspectorPageAgent.h"
 #include "InspectorState.h"
@@ -53,6 +58,9 @@
 #include <wtf/Vector.h>
 
 using WebCore::TypeBuilder::IndexedDB::SecurityOriginWithDatabaseNames;
+using WebCore::TypeBuilder::IndexedDB::DatabaseWithObjectStores;
+using WebCore::TypeBuilder::IndexedDB::ObjectStore;
+using WebCore::TypeBuilder::IndexedDB::ObjectStoreIndex;
 
 namespace WebCore {
 
@@ -96,7 +104,7 @@
 
 class GetDatabaseNamesCallback : public InspectorIDBCallback {
 public:
-    static PassRefPtr<GetDatabaseNamesCallback> create(PassRefPtr<InspectorIndexedDBAgent::FrontendProvider> frontendProvider, int requestId, const String& securityOrigin)
+    static PassRefPtr<GetDatabaseNamesCallback> create(InspectorIndexedDBAgent::FrontendProvider* frontendProvider, int requestId, const String& securityOrigin)
     {
         return adoptRef(new GetDatabaseNamesCallback(frontendProvider, requestId, securityOrigin));
     }
@@ -120,7 +128,7 @@
     }
 
 private:
-    GetDatabaseNamesCallback(PassRefPtr<InspectorIndexedDBAgent::FrontendProvider> frontendProvider, int requestId, const String& securityOrigin)
+    GetDatabaseNamesCallback(InspectorIndexedDBAgent::FrontendProvider* frontendProvider, int requestId, const String& securityOrigin)
         : m_frontendProvider(frontendProvider)
         , m_requestId(requestId)
         , m_securityOrigin(securityOrigin) { }
@@ -129,6 +137,131 @@
     String m_securityOrigin;
 };
 
+class ExecutableWithDatabase : public RefCounted<ExecutableWithDatabase> {
+public:
+    virtual ~ExecutableWithDatabase() { };
+    void start(IDBFactoryBackendInterface*, SecurityOrigin*, Frame*, const String& databaseName);
+    virtual void execute(PassRefPtr<IDBDatabaseBackendInterface>) = 0;
+};
+
+class OpenDatabaseCallback : public InspectorIDBCallback {
+public:
+    static PassRefPtr<OpenDatabaseCallback> create(ExecutableWithDatabase* executableWithDatabase)
+    {
+        return adoptRef(new OpenDatabaseCallback(executableWithDatabase));
+    }
+
+    virtual ~OpenDatabaseCallback() { }
+
+    virtual void onSuccess(PassRefPtr<IDBDatabaseBackendInterface> idbDatabase)
+    {
+        m_executableWithDatabase->execute(idbDatabase);
+    }
+
+private:
+    OpenDatabaseCallback(ExecutableWithDatabase* executableWithDatabase)
+        : m_executableWithDatabase(executableWithDatabase) { }
+    RefPtr<ExecutableWithDatabase> m_executableWithDatabase;
+};
+
+void ExecutableWithDatabase::start(IDBFactoryBackendInterface* idbFactory, SecurityOrigin* securityOrigin, Frame* frame, const String& databaseName)
+{
+    RefPtr<OpenDatabaseCallback> callback = OpenDatabaseCallback::create(this);
+    idbFactory->open(databaseName, callback.get(), securityOrigin, frame, String());
+}
+
+static PassRefPtr<IDBTransactionBackendInterface> transactionForDatabase(IDBDatabaseBackendInterface* idbDatabase, const String& objectStoreName)
+{
+    ExceptionCode ec;
+    RefPtr<DOMStringList> transactionObjectStoreNamesList = DOMStringList::create();
+    transactionObjectStoreNamesList->append(objectStoreName);
+    RefPtr<IDBTransactionBackendInterface> idbTransaction = idbDatabase->transaction(transactionObjectStoreNamesList.get(), IDBTransaction::READ_ONLY, ec);
+    if (ec)
+        return 0;
+    return idbTransaction;
+}
+
+static PassRefPtr<IDBObjectStoreBackendInterface> objectStoreForTransaction(IDBTransactionBackendInterface* idbTransaction, const String& objectStoreName)
+{
+    ExceptionCode ec;
+    RefPtr<IDBObjectStoreBackendInterface> idbObjectStore = idbTransaction->objectStore(objectStoreName, ec);
+    if (ec)
+        return 0;
+    return idbObjectStore;
+}
+
+static PassRefPtr<IDBIndexBackendInterface> indexForObjectStore(IDBObjectStoreBackendInterface* idbObjectStore, const String& indexName)
+{
+    ExceptionCode ec;
+    RefPtr<IDBIndexBackendInterface> idbIndex = idbObjectStore->index(indexName, ec);
+    if (ec)
+        return 0;
+    return idbIndex;
+}
+
+class DatabaseLoaderCallback : public ExecutableWithDatabase {
+public:
+    static PassRefPtr<DatabaseLoaderCallback> create(InspectorIndexedDBAgent::FrontendProvider* frontendProvider, int requestId)
+    {
+        return adoptRef(new DatabaseLoaderCallback(frontendProvider, requestId));
+    }
+
+    virtual ~DatabaseLoaderCallback() { }
+
+    virtual void execute(PassRefPtr<IDBDatabaseBackendInterface> idbDatabase)
+    {
+        if (!m_frontendProvider->frontend())
+            return;
+
+        RefPtr<InspectorArray> objectStores = InspectorArray::create();
+
+        RefPtr<DOMStringList> objectStoreNamesList = idbDatabase->objectStoreNames();
+        for (size_t i = 0; i < objectStoreNamesList->length(); ++i) {
+            String objectStoreName = objectStoreNamesList->item(i);
+            RefPtr<IDBTransactionBackendInterface> idbTransaction = transactionForDatabase(idbDatabase.get(), objectStoreName);
+            if (!idbTransaction)
+                continue;
+            RefPtr<IDBObjectStoreBackendInterface> idbObjectStore = objectStoreForTransaction(idbTransaction.get(), objectStoreName);
+            if (!idbObjectStore)
+                continue;
+
+            RefPtr<InspectorArray> indexes = InspectorArray::create();
+            RefPtr<DOMStringList> indexNamesList = idbObjectStore->indexNames();
+            for (size_t j = 0; j < indexNamesList->length(); ++j) {
+                RefPtr<IDBIndexBackendInterface> idbIndex = indexForObjectStore(idbObjectStore.get(), indexNamesList->item(j));
+                if (!idbIndex)
+                    continue;
+
+                RefPtr<ObjectStoreIndex> objectStoreIndex = ObjectStoreIndex::create()
+                    .setName(idbIndex->name())
+                    .setKeyPath(idbIndex->keyPath())
+                    .setUnique(idbIndex->unique())
+                    .setMultiEntry(idbIndex->multiEntry());
+                indexes->pushObject(objectStoreIndex);
+            }
+
+            RefPtr<ObjectStore> objectStore = ObjectStore::create()
+                .setName(idbObjectStore->name())
+                .setKeyPath(idbObjectStore->keyPath())
+                .setIndexes(indexes);
+            objectStores->pushObject(objectStore);
+        }
+        RefPtr<DatabaseWithObjectStores> result = DatabaseWithObjectStores::create()
+            .setName(idbDatabase->name())
+            .setVersion(idbDatabase->version())
+            .setObjectStores(objectStores);
+
+        m_frontendProvider->frontend()->databaseLoaded(m_requestId, result);
+    }
+
+private:
+    DatabaseLoaderCallback(InspectorIndexedDBAgent::FrontendProvider* frontendProvider, int requestId)
+        : m_frontendProvider(frontendProvider)
+        , m_requestId(requestId) { }
+    RefPtr<InspectorIndexedDBAgent::FrontendProvider> m_frontendProvider;
+    int m_requestId;
+};
+
 } // namespace
 
 InspectorIndexedDBAgent::InspectorIndexedDBAgent(InstrumentingAgents* instrumentingAgents, InspectorState* state, InspectorPageAgent* pageAgent)
@@ -171,23 +304,55 @@
     m_state->setBoolean(IndexedDBAgentState::indexedDBAgentEnabled, false);
 }
 
-void InspectorIndexedDBAgent::requestDatabaseNamesForFrame(ErrorString* error, int requestId, const String& frameId)
+static Document* assertDocument(const String& frameId, InspectorPageAgent* pageAgent, ErrorString* error)
 {
-    Frame* frame = m_pageAgent->frameForId(frameId);
+    Frame* frame = pageAgent->frameForId(frameId);
     Document* document = frame ? frame->document() : 0;
+
+    if (!document)
+        *error = "No document for given frame found";
+
+    return document;
+}
+
+static IDBFactoryBackendInterface* assertIDBFactory(Document* document, ErrorString* error)
+{
     Page* page = document ? document->page() : 0;
-    IDBFactoryBackendInterface* idbBackend = page ? page->group().idbFactory() : 0;
+    IDBFactoryBackendInterface* idbFactory = page ? page->group().idbFactory() : 0;
 
-    if (!idbBackend) {
+    if (!idbFactory)
         *error = "No IndexedDB factory for given frame found";
+
+    return idbFactory;
+}
+
+void InspectorIndexedDBAgent::requestDatabaseNamesForFrame(ErrorString* error, int requestId, const String& frameId)
+{
+    Document* document = assertDocument(frameId, m_pageAgent, error);
+    if (!document)
         return;
-    }
+    IDBFactoryBackendInterface* idbFactory = assertIDBFactory(document, error);
+    if (!idbFactory)
+        return;
 
-    RefPtr<GetDatabaseNamesCallback> callback = GetDatabaseNamesCallback::create(m_frontendProvider, requestId, document->securityOrigin()->toString());
+    RefPtr<GetDatabaseNamesCallback> callback = GetDatabaseNamesCallback::create(m_frontendProvider.get(), requestId, document->securityOrigin()->toString());
     GroupSettings* groupSettings = document->page()->group().groupSettings();
-    idbBackend->getDatabaseNames(callback.get(), document->securityOrigin(), document->frame(), groupSettings->indexedDBDatabasePath());
+    idbFactory->getDatabaseNames(callback.get(), document->securityOrigin(), document->frame(), groupSettings->indexedDBDatabasePath());
 }
 
+void InspectorIndexedDBAgent::requestDatabase(ErrorString* error, int requestId, const String& frameId, const String& databaseName)
+{
+    Document* document = assertDocument(frameId, m_pageAgent, error);
+    if (!document)
+        return;
+    IDBFactoryBackendInterface* idbFactory = assertIDBFactory(document, error);
+    if (!idbFactory)
+        return;
+
+    RefPtr<DatabaseLoaderCallback> databaseLoaderCallback = DatabaseLoaderCallback::create(m_frontendProvider.get(), requestId);
+    databaseLoaderCallback->start(idbFactory, document->securityOrigin(), document->frame(), databaseName);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(INSPECTOR) && ENABLE(INDEXED_DATABASE)

Modified: trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.h (105863 => 105864)


--- trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.h	2012-01-25 11:54:51 UTC (rev 105863)
+++ trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.h	2012-01-25 12:01:49 UTC (rev 105864)
@@ -61,6 +61,7 @@
     void enable(ErrorString*);
     void disable(ErrorString*);
     void requestDatabaseNamesForFrame(ErrorString*, int requestId, const String& frameId);
+    void requestDatabase(ErrorString*, int requestId, const String& frameId, const String& databaseName);
 private:
     InspectorIndexedDBAgent(InstrumentingAgents*, InspectorState*, InspectorPageAgent*);
 

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


--- trunk/Source/WebCore/inspector/front-end/IndexedDBModel.js	2012-01-25 11:54:51 UTC (rev 105863)
+++ trunk/Source/WebCore/inspector/front-end/IndexedDBModel.js	2012-01-25 12:01:49 UTC (rev 105864)
@@ -34,12 +34,12 @@
  */
 WebInspector.IndexedDBModel = function()
 {
-    this._indexedDBAgent = new WebInspector.IndexedDBRequestManager();
+    this._indexedDBRequestManager = new WebInspector.IndexedDBRequestManager();
     
     WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, this._frameNavigated, this);
     WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, this._frameDetached, this);
     
-    this._securityOriginByFrameId = {};
+    this._frames = {};
     this._frameIdsBySecurityOrigin = {};
     this._databaseNamesBySecurityOrigin = {};
 
@@ -79,18 +79,18 @@
     {
         var resourceTreeFrame = /** @type {WebInspector.ResourceTreeFrame} */ event.data;
         this._originRemovedFromFrame(resourceTreeFrame.id);
-        this._indexedDBAgent._frameDetached(resourceTreeFrame.id);
+        this._indexedDBRequestManager._frameDetached(resourceTreeFrame.id);
     },
 
     _reset: function()
     {
-        this._securityOriginByFrameId = {};
+        this._frames = {};
         this._frameIdsBySecurityOrigin = {};
         this._databaseNamesBySecurityOrigin = {};
-        this._indexedDBAgent._reset();
+        this._indexedDBRequestManager._reset();
         // FIXME: dispatch events?
     },
-    
+
     /**
      * @param {WebInspector.ResourceTreeFrame} resourceTreeFrame
      */
@@ -103,7 +103,7 @@
         else
             this._loadDatabaseNamesForFrame(resourceTreeFrame.id);
     },
-    
+
     /**
      * @param {string} frameId
      * @param {string} securityOrigin
@@ -116,20 +116,20 @@
             this._databaseNamesBySecurityOrigin[securityOrigin] = [];
             // FIXME: dispatch origin added event.
         }
-        this._securityOriginByFrameId[frameId] = securityOrigin;
+        this._frames[frameId] = new WebInspector.IndexedDBModel.Frame(frameId, securityOrigin);
     },
-    
+
     /**
      * @param {string} frameId
      */
     _originRemovedFromFrame: function(frameId)
     {
-        var currentSecurityOrigin = this._securityOriginByFrameId[frameId];
+        var currentSecurityOrigin = this._frames[frameId] ? this._frames[frameId].securityOrigin : null;
         if (!currentSecurityOrigin)
             return;
-        
-        delete this._securityOriginByFrameId[frameId];
 
+        delete this._frames[frameId];
+
         var frameIdsForOrigin = this._frameIdsBySecurityOrigin[currentSecurityOrigin];
         for (var i = 0; i < frameIdsForOrigin; ++i) {
             if (frameIdsForOrigin[i] === frameId) {
@@ -148,10 +148,10 @@
     {
         var frameIdsForOrigin = this._frameIdsBySecurityOrigin[securityOrigin];
         for (var i = 0; i < frameIdsForOrigin; ++i)
-            delete this._securityOriginByFrameId[frameIdsForOrigin[i]]
+            delete this._frames[frameIdsForOrigin[i]];
         delete this._frameIdsBySecurityOrigin[securityOrigin];
         for (var i = 0; i < this._databaseNamesBySecurityOrigin[securityOrigin]; ++i)
-            this._databaseRemoved(securityOrigin, this._databaseNamesBySecurityOrigin[securityOrigin][i]);                
+            this._databaseRemoved(securityOrigin, this._databaseNamesBySecurityOrigin[securityOrigin][i]);
         delete this._databaseNamesBySecurityOrigin[securityOrigin];
         // FIXME: dispatch origin removed event.
     },
@@ -168,9 +168,9 @@
         var oldDatabaseNames = {};
         for (var i = 0; i < this._databaseNamesBySecurityOrigin[securityOrigin].length; ++i)
             oldDatabaseNames[databaseNames[i]] = true;
-        
+
         this._databaseNamesBySecurityOrigin[securityOrigin] = databaseNames;
-        
+
         for (var databaseName in oldDatabaseNames) {
             if (!newDatabaseNames[databaseName])
                 this._databaseRemoved(securityOrigin, databaseName);
@@ -179,11 +179,11 @@
             if (!oldDatabaseNames[databaseName])
                 this._databaseAdded(securityOrigin, databaseName);
         }
-        
+
         if (!this._databaseNamesBySecurityOrigin[securityOrigin].length)
             this._originRemoved(securityOrigin);
     },
-    
+
     /**
      * @param {string} securityOrigin
      * @param {string} databaseName
@@ -192,13 +192,14 @@
     {
         // FIXME: dispatch database added event.
     },
-    
+
     /**
      * @param {string} securityOrigin
      * @param {string} databaseName
      */
     _databaseRemoved: function(securityOrigin, databaseName)
     {
+        this._indexedDBRequestManager._databaseRemoved(this._frameIdsBySecurityOrigin[securityOrigin], databaseName);
         // FIXME: dispatch database removed event.
     },
 
@@ -213,7 +214,7 @@
         function callback(securityOriginWithDatabaseNames)
         {
             var databaseNames = securityOriginWithDatabaseNames.databaseNames;
-            var oldSecurityOrigin = this._securityOriginByFrameId[frameId];
+            var oldSecurityOrigin = this._frames[frameId] ? this._frames[frameId].securityOrigin : null;
             if (oldSecurityOrigin && oldSecurityOrigin === securityOriginWithDatabaseNames.securityOrigin)
                 this._updateOriginDatabaseNames(securityOriginWithDatabaseNames.securityOrigin, securityOriginWithDatabaseNames.databaseNames);
             else {
@@ -223,7 +224,40 @@
             }
         }
 
-        this._indexedDBAgent.requestDatabaseNamesForFrame(frameId, callback.bind(this));
+        this._indexedDBRequestManager.requestDatabaseNamesForFrame(frameId, callback.bind(this));
+    },
+
+    /**
+     * @param {string} frameId
+     * @param {string} databaseName
+     */
+    _loadDatabase: function(frameId, databaseName)
+    {
+        /**
+         * @param {IndexedDBAgent.DatabaseWithObjectStores} databaseWithObjectStores
+         */
+        function callback(databaseWithObjectStores)
+        {
+            if (!this._frames[frameId])
+                return;
+
+            var databaseModel = new WebInspector.IndexedDBModel.Database(databaseName, databaseWithObjectStores.version);
+            this._frames[frameId].databases[databaseName] = databaseModel;
+            for (var i = 0; i < databaseWithObjectStores.objectStores.length; ++i) {
+                var objectStore = databaseWithObjectStores.objectStores[i];
+                var objectStoreModel = new WebInspector.IndexedDBModel.ObjectStore(objectStore.name, objectStore.keyPath);
+                for (var j = 0; j < objectStore.indexes.length; ++j) {
+                     var objectStoreIndex = objectStore.indexes[j];
+                     var objectStoreIndexModel = new WebInspector.IndexedDBModel.ObjectStoreIndex(objectStoreIndex.name, objectStoreIndex.keyPath, objectStoreIndex.unique, objectStoreIndex.multiEntry);
+                     objectStoreModel.indexes[objectStoreIndexModel.name] = objectStoreIndexModel;
+                }
+                databaseModel.objectStores[objectStoreModel.name] = objectStoreModel;
+            }
+
+            // FIXME: dispatch database loaded event.
+        }
+
+        this._indexedDBRequestManager.requestDatabase(frameId, databaseName, callback.bind(this));
     }
 }
 
@@ -231,7 +265,55 @@
 
 /**
  * @constructor
+ * @param {string} frameId
+ * @param {string} securityOrigin
  */
+WebInspector.IndexedDBModel.Frame = function(frameId, securityOrigin)
+{
+    this.frameId = frameId;
+    this.securityOrigin = securityOrigin;
+    this.databases = {};
+}
+
+/**
+ * @constructor
+ * @param {string} name
+ */
+WebInspector.IndexedDBModel.Database = function(name, version)
+{
+    this.name = name;
+    this.version = version;
+    this.objectStores = {};
+}
+
+/**
+ * @constructor
+ * @param {string} name
+ * @param {string} keyPath
+ */
+WebInspector.IndexedDBModel.ObjectStore = function(name, keyPath)
+{
+    this.name = name;
+    this.keyPath = keyPath;
+    this.indexes = {};
+}
+
+/**
+ * @constructor
+ * @param {string} name
+ * @param {string} keyPath
+ */
+WebInspector.IndexedDBModel.ObjectStoreIndex = function(name, keyPath, unique, multiEntry)
+{
+    this.name = name;
+    this.keyPath = keyPath;
+    this.unique = unique;
+    this.multiEntry = multiEntry;
+}
+
+/**
+ * @constructor
+ */
 WebInspector.IndexedDBRequestManager = function()
 {
     this._lastRequestId = 0;
@@ -250,7 +332,7 @@
     {
         var requestId = this._requestId();
         var request = new WebInspector.IndexedDBRequestManager.DatabasesForFrameRequest(frameId, callback);
-        this._requestDatabaseNamesForFrameCallbacks[requestId] = request; 
+        this._requestDatabaseNamesForFrameCallbacks[requestId] = request;
 
         function innerCallback(error)
         {
@@ -262,7 +344,7 @@
 
         IndexedDBAgent.requestDatabaseNamesForFrame(requestId, frameId, innerCallback);
     },
-    
+
     /**
      * @param {number} requestId
      * @param {IndexedDBAgent.SecurityOriginWithDatabaseNames} securityOriginWithDatabaseNames
@@ -270,13 +352,48 @@
     _databaseNamesLoaded: function(requestId, securityOriginWithDatabaseNames)
     {
         var request = this._requestDatabaseNamesForFrameCallbacks[requestId];
-        if (!request.callback)
+        if (!request)
             return;
-        
+
         request.callback(securityOriginWithDatabaseNames);
     },
 
     /**
+     * @param {string} frameId
+     * @param {string} databaseName
+     * @param {function(IndexedDBAgent.DatabaseWithObjectStores)} callback
+     */
+    requestDatabase: function(frameId, databaseName, callback)
+    {
+        var requestId = this._requestId();
+        var request = new WebInspector.IndexedDBRequestManager.DatabaseRequest(frameId, databaseName, callback);
+        this._requestDatabaseCallbacks[requestId] = request;
+
+        function innerCallback(error)
+        {
+            if (error) {
+                console.error("IndexedDBAgent error: " + error);
+                return;
+            }
+        }
+
+        IndexedDBAgent.requestDatabase(requestId, frameId, databaseName, innerCallback);
+    },
+    
+    /**
+     * @param {number} requestId
+     * @param {IndexedDBAgent.DatabaseWithObjectStores} databaseWithObjectStores
+     */
+    _databaseLoaded: function(requestId, databaseWithObjectStores)
+    {
+        var request = this._requestDatabaseCallbacks[requestId];
+        if (!request)
+            return;
+
+        request.callback(databaseWithObjectStores);
+    },
+
+    /**
      * @return {number}
      */
     _requestId: function()
@@ -293,11 +410,29 @@
             if (this._requestDatabaseNamesForFrameCallbacks[requestId].frameId === frameId)
                 delete this._requestDatabaseNamesForFrameCallbacks[requestId];
         }
+        
+        for (var requestId in this._requestDatabaseCallbacks) {
+            if (this._requestDatabaseCallbacks[requestId].frameId === frameId)
+                delete this._requestDatabaseCallbacks[requestId];
+        }
     },
 
+    /**
+     * @param {string} frameId
+     */
+    _databaseRemoved: function(frameId, databaseName)
+    {
+        for (var requestId in this._requestDatabaseCallbacks) {
+            if (this._requestDatabaseCallbacks[requestId].frameId === frameId && this._requestDatabaseCallbacks[requestId].databaseName === databaseName)
+                delete this._requestDatabaseCallbacks[requestId];
+        }
+    },
+
     _reset: function()
     {
         this._requestDatabaseNamesForFrameCallbacks = {};
+        this._requestDatabaseCallbacks = {};
+
     }
 }
 
@@ -312,6 +447,16 @@
 
 /**
  * @constructor
+ */
+WebInspector.IndexedDBRequestManager.DatabaseRequest = function(frameId, databaseName, callback)
+{
+    this.frameId = frameId;
+    this.databaseName = databaseName;
+    this.callback = callback;
+}
+
+/**
+ * @constructor
  * @implements {IndexedDBAgent.Dispatcher}
  * @param {WebInspector.IndexedDBRequestManager} indexedDBRequestManager
  */
@@ -328,5 +473,14 @@
     databaseNamesLoaded: function(requestId, securityOriginWithDatabaseNames)
     {
         this._agentWrapper._databaseNamesLoaded(requestId, securityOriginWithDatabaseNames);
+    },
+
+    /**
+     * @param {number} requestId
+     * @param {IndexedDBAgent.DatabaseWithObjectStores} databaseWithObjectStores
+     */
+    databaseLoaded: function(requestId, databaseWithObjectStores)
+    {
+        this._agentWrapper._databaseLoaded(requestId, databaseWithObjectStores);
     }
 }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to