diff --git a/devtools/client/storage/ui.js b/devtools/client/storage/ui.js index 92391e06cb2f..b64825c3ccc7 100644 --- a/devtools/client/storage/ui.js +++ b/devtools/client/storage/ui.js @@ -225,12 +225,15 @@ StorageUI.prototype = { return this.storageTypes[type]; }, - makeFieldsEditable: function* () { - let actor = this.getCurrentActor(); - - if (typeof actor.getEditableFields !== "undefined") { - let fields = yield actor.getEditableFields(); - this.table.makeFieldsEditable(fields); + /** + * Make column fields editable + * + * @param {Array} editableFields + * An array of keys of columns to be made editable + */ + makeFieldsEditable: function* (editableFields) { + if (editableFields && editableFields.length > 0) { + this.table.makeFieldsEditable(editableFields); } else if (this.table._editableFieldsEngine) { this.table._editableFieldsEngine.destroy(); } @@ -486,11 +489,25 @@ StorageUI.prototype = { } try { + if (reason === REASON.POPULATE) { + let subType = null; + // The indexedDB type could have sub-type data to fetch. + // If having names specified, then it means + // we are fetching details of specific database or of object store. + if (type == "indexedDB" && names) { + let [ dbName, objectStoreName ] = JSON.parse(names[0]); + if (dbName) { + subType = "database"; + } + if (objectStoreName) { + subType = "object store"; + } + } + yield this.resetColumns(type, host, subType); + } + let {data} = yield storageType.getStoreObjects(host, names, fetchOpts); if (data.length) { - if (reason === REASON.POPULATE) { - yield this.resetColumns(data[0], type, host); - } this.populateTable(data, reason); } this.emit("store-objects-updated"); @@ -731,36 +748,46 @@ StorageUI.prototype = { /** * Resets the column headers in the storage table with the pased object `data` * - * @param {object} data - * The object from which key and values will be used for naming the - * headers of the columns * @param {string} type * The type of storage corresponding to the after-reset columns in the * table. * @param {string} host * The host name corresponding to the table after reset. + * + * @param {string} [subType] + * The sub type under the given type. */ - resetColumns: function* (data, type, host) { - let columns = {}; + resetColumns: function* (type, host, subtype) { + this.table.host = host; + this.table.datatype = type; + let uniqueKey = null; - for (let key in data) { + let columns = {}; + let editableFields = []; + let fields = yield this.getCurrentActor().getFields(subtype); + + fields.forEach(f => { if (!uniqueKey) { - this.table.uniqueId = uniqueKey = key; + this.table.uniqueId = uniqueKey = f.name; } - columns[key] = key; + + if (f.editable) { + editableFields.push(f.name); + } + + columns[f.name] = f.name; try { - columns[key] = L10N.getStr("table.headers." + type + "." + key); + columns[f.name] = L10N.getStr("table.headers." + type + "." + f.name); } catch (e) { console.error("Unable to localize table header type:" + type + - " key:" + key); + " key:" + f.name); } - } + }); + this.table.setColumns(columns, null, HIDDEN_COLUMNS); - this.table.datatype = type; - this.table.host = host; this.hideSidebar(); - yield this.makeFieldsEditable(); + yield this.makeFieldsEditable(editableFields); }, /** diff --git a/devtools/server/actors/storage.js b/devtools/server/actors/storage.js index 77297d39d1ed..7a605a1d5bb9 100644 --- a/devtools/server/actors/storage.js +++ b/devtools/server/actors/storage.js @@ -81,6 +81,10 @@ var StorageActors = {}; * so that it can be transferred over wire. * - populateStoresForHost : Given a host, populate the map of all store * objects for it + * - getFields: Given a subType(optional), get an array of objects containing + * column field info. The info includes, + * "name" is name of colume key. + * "editable" is 1 means editable field; 0 means uneditable. * * @param {string} typeName * The typeName of the actor. @@ -548,21 +552,17 @@ StorageActors.createActor({ return null; }, - /** - * This method marks the table as editable. - * - * @return {Array} - * An array of column header ids. - */ - getEditableFields: Task.async(function* () { + getFields: Task.async(function* () { return [ - "name", - "path", - "host", - "expires", - "value", - "isSecure", - "isHttpOnly" + { name: "name", editable: 1}, + { name: "path", editable: 1}, + { name: "host", editable: 1}, + { name: "expires", editable: 1}, + { name: "lastAccessed", editable: 0}, + { name: "value", editable: 1}, + { name: "isDomain", editable: 0}, + { name: "isSecure", editable: 1}, + { name: "isHttpOnly", editable: 1} ]; }), @@ -1012,16 +1012,10 @@ function getObjectForLocalOrSessionStorage(type) { } }, - /** - * This method marks the fields as editable. - * - * @return {Array} - * An array of field ids. - */ - getEditableFields: Task.async(function* () { + getFields: Task.async(function* () { return [ - "name", - "value" + { name: "name", editable: 1}, + { name: "value", editable: 1} ]; }), @@ -1199,6 +1193,13 @@ StorageActors.createActor({ }; }), + getFields: Task.async(function* () { + return [ + { name: "url", editable: 0 }, + { name: "status", editable: 0 } + ]; + }), + getHostName(location) { if (!location.host) { return location.href; @@ -1653,6 +1654,35 @@ StorageActors.createActor({ return deferred.promise; } }, + + getFields: Task.async(function* (subType) { + switch (subType) { + // Detail of database + case "database": + return [ + { name: "objectStore", editable: 0 }, + { name: "keyPath", editable: 0 }, + { name: "autoIncrement", editable: 0 }, + { name: "indexes", editable: 0 }, + ]; + + // Detail of object store + case "object store": + return [ + { name: "name", editable: 0 }, + { name: "value", editable: 0 } + ]; + + // Detail of indexedDB for one origin + default: + return [ + { name: "db", editable: 0 }, + { name: "origin", editable: 0 }, + { name: "version", editable: 0 }, + { name: "objectStores", editable: 0 }, + ]; + } + }) }); var indexedDBHelpers = { diff --git a/devtools/shared/specs/storage.js b/devtools/shared/specs/storage.js index a5f80a25fadf..5d2fbb2f75d3 100644 --- a/devtools/shared/specs/storage.js +++ b/devtools/shared/specs/storage.js @@ -18,6 +18,14 @@ function createStorageSpec(options) { options: Arg(2, "nullable:json") }, response: RetVal(options.storeObjectType) + }, + getFields: { + request: { + subType: Arg(0, "nullable:string") + }, + response: { + value: RetVal("json") + } } };