Bug 1388208: Stop using FileUtils.getFile. r?mixedpuppy
This performs main thread IO to make sure that directories exist, which is not
something we should be doing on the startup path.
MozReview-Commit-ID: 2NrgRgY5ua6
--- a/toolkit/components/extensions/ExtensionParent.jsm
+++ b/toolkit/components/extensions/ExtensionParent.jsm
@@ -19,22 +19,22 @@ Cu.import("resource://gre/modules/Servic
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
"resource://gre/modules/AppConstants.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "DeferredSave",
"resource://gre/modules/DeferredSave.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "E10SUtils",
"resource:///modules/E10SUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
- "resource://gre/modules/FileUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "MessageChannel",
"resource://gre/modules/MessageChannel.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "NativeApp",
"resource://gre/modules/NativeMessaging.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "OS",
+ "resource://gre/modules/osfile.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
"resource://gre/modules/PrivateBrowsingUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Schemas",
"resource://gre/modules/Schemas.jsm");
XPCOMUtils.defineLazyServiceGetter(this, "gAddonPolicyService",
"@mozilla.org/addons/policy-service;1",
"nsIAddonPolicyService");
@@ -1376,23 +1376,26 @@ let IconDetails = {
},
};
StartupCache = {
DB_NAME: "ExtensionStartupCache",
STORE_NAMES: Object.freeze(["general", "locales", "manifests", "other", "permissions", "schemas"]),
- get file() {
- return FileUtils.getFile("ProfLD", ["startupCache", "webext.sc.lz4"]);
- },
+ file: OS.Path.join(OS.Constants.Path.localProfileDir, "startupCache", "webext.sc.lz4"),
get saver() {
if (!this._saver) {
- this._saver = new DeferredSave(this.file.path,
+ OS.File.makeDir(OS.Path.dirname(this.file), {
+ ignoreExisting: true,
+ from: OS.Constants.Path.localProfileDir,
+ });
+
+ this._saver = new DeferredSave(this.file,
() => this.getBlob(),
{delay: 5000});
}
return this._saver;
},
async save() {
return this.saver.saveChanges();
--- a/toolkit/components/extensions/ExtensionPermissions.jsm
+++ b/toolkit/components/extensions/ExtensionPermissions.jsm
@@ -3,38 +3,38 @@
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionParent",
"resource://gre/modules/ExtensionParent.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionUtils",
"resource://gre/modules/ExtensionUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
- "resource://gre/modules/FileUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "JSONFile",
"resource://gre/modules/JSONFile.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "OS",
+ "resource://gre/modules/osfile.jsm");
XPCOMUtils.defineLazyGetter(this, "StartupCache", () => ExtensionParent.StartupCache);
this.EXPORTED_SYMBOLS = ["ExtensionPermissions"];
const FILE_NAME = "extension-preferences.json";
let prefs;
let _initPromise;
async function _lazyInit() {
- let file = FileUtils.getFile("ProfD", [FILE_NAME]);
+ let path = OS.Path.join(OS.Constants.Path.profileDir, FILE_NAME);
- prefs = new JSONFile({path: file.path});
+ prefs = new JSONFile({path});
prefs.data = {};
try {
- let blob = await ExtensionUtils.promiseFileContents(file);
+ let blob = await ExtensionUtils.promiseFileContents(path);
prefs.data = JSON.parse(new TextDecoder().decode(blob));
} catch (e) {
if (!e.becauseNoSuchFile) {
Cu.reportError(e);
}
}
}
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -32,18 +32,18 @@ const appinfo = Cc["@mozilla.org/xre/app
let nextId = 0;
XPCOMUtils.defineLazyGetter(this, "uniqueProcessID", () => appinfo.uniqueProcessID);
function getUniqueId() {
return `${nextId++}-${uniqueProcessID}`;
}
-async function promiseFileContents(file) {
- let res = await OS.File.read(file.path);
+async function promiseFileContents(path) {
+ let res = await OS.File.read(path);
return res.buffer;
}
/**
* An Error subclass for which complete error messages are always passed
* to extensions, rather than being interpreted as an unknown error.
*/