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);
}
}