diff options
Diffstat (limited to 'devtools/shared/specs/storage.js')
-rw-r--r-- | devtools/shared/specs/storage.js | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/devtools/shared/specs/storage.js b/devtools/shared/specs/storage.js new file mode 100644 index 0000000000..448230cd70 --- /dev/null +++ b/devtools/shared/specs/storage.js @@ -0,0 +1,340 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +const protocol = require("devtools/shared/protocol"); +const { Arg, RetVal, types } = protocol; + +const childSpecs = {}; + +function createStorageSpec(options) { + // common methods for all storage types + const methods = { + getStoreObjects: { + request: { + host: Arg(0), + names: Arg(1, "nullable:array:string"), + options: Arg(2, "nullable:json"), + }, + response: RetVal(options.storeObjectType), + }, + getFields: { + request: { + subType: Arg(0, "nullable:string"), + }, + response: { + value: RetVal("json"), + }, + }, + }; + + // extra methods specific for storage type + Object.assign(methods, options.methods); + + childSpecs[options.typeName] = protocol.generateActorSpec({ + typeName: options.typeName, + methods, + }); +} + +// Cookies store object +types.addDictType("cookieobject", { + uniqueKey: "string", + name: "string", + value: "longstring", + path: "nullable:string", + host: "string", + hostOnly: "boolean", + isSecure: "boolean", + isHttpOnly: "boolean", + creationTime: "number", + lastAccessed: "number", + expires: "number", +}); + +// Array of cookie store objects +types.addDictType("cookiestoreobject", { + total: "number", + offset: "number", + data: "array:nullable:cookieobject", +}); + +// Common methods for edit/remove +const editRemoveMethods = { + getFields: { + request: {}, + response: { + value: RetVal("json"), + }, + }, + editItem: { + request: { + data: Arg(0, "json"), + }, + response: {}, + }, + removeItem: { + request: { + host: Arg(0, "string"), + name: Arg(1, "string"), + }, + response: {}, + }, +}; + +// Cookies actor spec +createStorageSpec({ + typeName: "cookies", + storeObjectType: "cookiestoreobject", + methods: Object.assign( + {}, + editRemoveMethods, + { + addItem: { + request: { + guid: Arg(0, "string"), + }, + response: {}, + }, + }, + { + removeAll: { + request: { + host: Arg(0, "string"), + domain: Arg(1, "nullable:string"), + }, + response: {}, + }, + }, + { + removeAllSessionCookies: { + request: { + host: Arg(0, "string"), + domain: Arg(1, "nullable:string"), + }, + response: {}, + }, + } + ), +}); + +// Local Storage / Session Storage store object +types.addDictType("storageobject", { + name: "string", + value: "longstring", +}); + +// Common methods for local/session storage +const storageMethods = Object.assign( + {}, + editRemoveMethods, + { + addItem: { + request: { + guid: Arg(0, "string"), + host: Arg(1, "nullable:string"), + }, + response: {}, + }, + }, + { + removeAll: { + request: { + host: Arg(0, "string"), + }, + response: {}, + }, + } +); + +// Array of Local Storage / Session Storage store objects +types.addDictType("storagestoreobject", { + total: "number", + offset: "number", + data: "array:nullable:storageobject", +}); + +createStorageSpec({ + typeName: "localStorage", + storeObjectType: "storagestoreobject", + methods: storageMethods, +}); + +createStorageSpec({ + typeName: "sessionStorage", + storeObjectType: "storagestoreobject", + methods: storageMethods, +}); + +types.addDictType("extensionobject", { + name: "nullable:string", + value: "nullable:longstring", + area: "string", + isValueEditable: "boolean", +}); + +types.addDictType("extensionstoreobject", { + total: "number", + offset: "number", + data: "array:nullable:extensionobject", +}); + +createStorageSpec({ + typeName: "extensionStorage", + storeObjectType: "extensionstoreobject", + // Same as storageMethods except for addItem + methods: Object.assign({}, editRemoveMethods, { + removeAll: { + request: { + host: Arg(0, "string"), + }, + response: {}, + }, + }), +}); + +types.addDictType("cacheobject", { + url: "string", + status: "string", +}); + +// Array of Cache store objects +types.addDictType("cachestoreobject", { + total: "number", + offset: "number", + data: "array:nullable:cacheobject", +}); + +// Cache storage spec +createStorageSpec({ + typeName: "Cache", + storeObjectType: "cachestoreobject", + methods: { + removeAll: { + request: { + host: Arg(0, "string"), + name: Arg(1, "string"), + }, + response: {}, + }, + removeItem: { + request: { + host: Arg(0, "string"), + name: Arg(1, "string"), + }, + response: {}, + }, + }, +}); + +// Indexed DB store object +// This is a union on idb object, db metadata object and object store metadata +// object +types.addDictType("idbobject", { + uniqueKey: "string", + name: "nullable:string", + db: "nullable:string", + objectStore: "nullable:string", + origin: "nullable:string", + version: "nullable:number", + storage: "nullable:string", + objectStores: "nullable:number", + keyPath: "nullable:string", + autoIncrement: "nullable:boolean", + indexes: "nullable:string", + value: "nullable:longstring", +}); + +// Array of Indexed DB store objects +types.addDictType("idbstoreobject", { + total: "number", + offset: "number", + data: "array:nullable:idbobject", +}); + +// Result of Indexed DB delete operation: can block or throw error +types.addDictType("idbdeleteresult", { + blocked: "nullable:boolean", + error: "nullable:string", +}); + +createStorageSpec({ + typeName: "indexedDB", + storeObjectType: "idbstoreobject", + methods: { + removeDatabase: { + request: { + host: Arg(0, "string"), + name: Arg(1, "string"), + }, + response: RetVal("idbdeleteresult"), + }, + removeAll: { + request: { + host: Arg(0, "string"), + name: Arg(1, "string"), + }, + response: {}, + }, + removeItem: { + request: { + host: Arg(0, "string"), + name: Arg(1, "string"), + }, + response: {}, + }, + }, +}); + +// Update notification object +types.addDictType("storeUpdateObject", { + changed: "nullable:json", + deleted: "nullable:json", + added: "nullable:json", +}); + +// Generate a type definition for an object with actors for all storage types. +types.addDictType( + "storelist", + Object.keys(childSpecs).reduce((obj, type) => { + obj[type] = type; + return obj; + }, {}) +); + +exports.childSpecs = childSpecs; + +exports.storageSpec = protocol.generateActorSpec({ + typeName: "storage", + + /** + * List of event notifications that the server can send to the client. + * + * - stores-update : When any store object in any storage type changes. + * - stores-cleared : When all the store objects are removed. + * - stores-reloaded : When all stores are reloaded. This generally mean that + * we should refetch everything again. + */ + events: { + "stores-update": { + type: "storesUpdate", + data: Arg(0, "storeUpdateObject"), + }, + "stores-cleared": { + type: "storesCleared", + data: Arg(0, "json"), + }, + "stores-reloaded": { + type: "storesReloaded", + data: Arg(0, "json"), + }, + }, + + methods: { + listStores: { + request: {}, + response: RetVal("storelist"), + }, + }, +}); |