mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-06 07:48:38 +09:00
parent
1ea18fdaf7
commit
5d33400c5b
1 changed files with 52 additions and 57 deletions
|
|
@ -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;
|
||||
}),
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue