summaryrefslogtreecommitdiffstats
path: root/devtools/server/actors/storage.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/actors/storage.js')
-rw-r--r--devtools/server/actors/storage.js109
1 files changed, 52 insertions, 57 deletions
diff --git a/devtools/server/actors/storage.js b/devtools/server/actors/storage.js
index f4fbbd8c3..497051e57 100644
--- a/devtools/server/actors/storage.js
+++ b/devtools/server/actors/storage.js
@@ -2,8 +2,6 @@
* 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/. */
-/* globals StopIteration */
-
"use strict";
const {Cc, Ci, Cu, CC} = require("chrome");
@@ -1733,7 +1731,9 @@ StorageActors.createActor({
if (!DebuggerServer.isInChildProcess) {
this.backToChild = (func, rv) => rv;
this.clearDBStore = indexedDBHelpers.clearDBStore;
- this.gatherFilesOrFolders = indexedDBHelpers.gatherFilesOrFolders;
+ this.findIDBPathsForHost = indexedDBHelpers.findIDBPathsForHost;
+ this.findSqlitePathsForHost = indexedDBHelpers.findSqlitePathsForHost;
+ this.findStorageTypePaths = indexedDBHelpers.findStorageTypePaths;
this.getDBMetaData = indexedDBHelpers.getDBMetaData;
this.getDBNamesForHost = indexedDBHelpers.getDBNamesForHost;
this.getNameFromDatabaseFile = indexedDBHelpers.getNameFromDatabaseFile;
@@ -2011,35 +2011,23 @@ var indexedDBHelpers = {
// idb/1556056096MeysDaabta.sqlite
// - PathToProfileDir/storage/temporary/http+++www.example.com/
// idb/1556056096MeysDaabta.sqlite
- //
// The subdirectory inside the storage folder is determined by the storage
// type:
// - default: { storage: "default" } or not specified.
// - permanent: { storage: "persistent" }.
// - temporary: { storage: "temporary" }.
- let sqliteFiles = yield this.gatherFilesOrFolders(storagePath, path => {
- if (path.endsWith(".sqlite")) {
- let { components } = OS.Path.split(path);
- let isIDB = components[components.length - 2] === "idb";
-
- return isIDB;
- }
- return false;
- });
+ let sqliteFiles = yield this.findSqlitePathsForHost(storagePath, sanitizedHost);
for (let file of sqliteFiles) {
let splitPath = OS.Path.split(file).components;
let idbIndex = splitPath.indexOf("idb");
- let name = splitPath[idbIndex - 1];
let storage = splitPath[idbIndex - 2];
let relative = file.substr(profileDir.length + 1);
- if (name.startsWith(sanitizedHost)) {
- files.push({
- file: relative,
- storage: storage === "permanent" ? "persistent" : storage
- });
- }
+ files.push({
+ file: relative,
+ storage: storage === "permanent" ? "persistent" : storage
+ });
}
if (files.length > 0) {
@@ -2057,48 +2045,55 @@ var indexedDBHelpers = {
}),
/**
- * Gather together all of the files in path and pass each path through a
- * validation function.
- *
- * @param {String}
- * Path in which to begin searching.
- * @param {Function}
- * Validation function, which checks each file path. If this function
- * Returns true the file path is kept.
- *
- * @returns {Array}
- * An array of file paths.
+ * Find all SQLite files that hold IndexedDB data for a host, such as:
+ * storage/temporary/http+++www.example.com/idb/1556056096MeysDaabta.sqlite
*/
- gatherFilesOrFolders: Task.async(function* (path, validationFunc) {
- let files = [];
- let iterator;
- let paths = [path];
-
- while (paths.length > 0) {
- try {
- iterator = new OS.File.DirectoryIterator(paths.pop());
-
- for (let child in iterator) {
- child = yield child;
-
- path = child.path;
-
- if (child.isDir) {
- paths.push(path);
- } else if (validationFunc(path)) {
- files.push(path);
- }
- }
- } catch (ex) {
- // Ignore StopIteration to prevent exiting the loop.
- if (ex != StopIteration) {
- throw ex;
+ findSqlitePathsForHost: Task.async(function* (storagePath, sanitizedHost) {
+ let sqlitePaths = [];
+ let idbPaths = yield this.findIDBPathsForHost(storagePath, sanitizedHost);
+ for (let idbPath of idbPaths) {
+ let iterator = new OS.File.DirectoryIterator(idbPath);
+ yield iterator.forEach(entry => {
+ if (!entry.isDir && entry.path.endsWith(".sqlite")) {
+ sqlitePaths.push(entry.path);
}
+ });
+ iterator.close();
+ }
+ return sqlitePaths;
+ }),
+
+ /**
+ * Find all paths that hold IndexedDB data for a host, such as:
+ * storage/temporary/http+++www.example.com/idb
+ */
+ findIDBPathsForHost: Task.async(function* (storagePath, sanitizedHost) {
+ let idbPaths = [];
+ let typePaths = yield this.findStorageTypePaths(storagePath);
+ for (let typePath of typePaths) {
+ let idbPath = OS.Path.join(typePath, sanitizedHost, "idb");
+ if (yield OS.File.exists(idbPath)) {
+ idbPaths.push(idbPath);
}
}
- iterator.close();
+ return idbPaths;
+ }),
- return files;
+ /**
+ * Find all the storage types, such as "default", "permanent", or "temporary".
+ * These names have changed over time, so it seems simpler to look through all types
+ * that currently exist in the profile.
+ */
+ findStorageTypePaths: Task.async(function* (storagePath) {
+ let iterator = new OS.File.DirectoryIterator(storagePath);
+ let typePaths = [];
+ yield iterator.forEach(entry => {
+ if (entry.isDir) {
+ typePaths.push(entry.path);
+ }
+ });
+ iterator.close();
+ return typePaths;
}),
/**