Bug 1334252: Find IDB storage for host more directly

Issue #31
This commit is contained in:
janekptacijarabaci 2018-03-02 15:06:49 +01:00 committed by Roy Tam
commit 5d33400c5b

View file

@ -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;
}),
/**