fune/mobile/android/components/DirectoryProvider.js
Kris Maglione a259026c9d Bug 1456035: Part 4 - Convert callers of XPCOMUtils.generateQI to ChromeUtils.generateQI. r=mccr8
This also removes any redundant Ci.nsISupports elements in the interface
lists.

This was done using the following script:

acecb401b7/processors/chromeutils-generateQI.jsm

MozReview-Commit-ID: AIx10P8GpZY

--HG--
extra : rebase_source : a29c07530586dc18ba040f19215475ac20fcfb3b
2018-04-22 20:55:06 -07:00

165 lines
5.6 KiB
JavaScript

/* 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/. */
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetters(this, {
AppConstants: "resource://gre/modules/AppConstants.jsm",
EventDispatcher: "resource://gre/modules/Messaging.jsm",
FileUtils: "resource://gre/modules/FileUtils.jsm",
Services: "resource://gre/modules/Services.jsm",
});
// -----------------------------------------------------------------------
// Directory Provider for special browser folders and files
// -----------------------------------------------------------------------
const NS_APP_CACHE_PARENT_DIR = "cachePDir";
const NS_APP_DISTRIBUTION_SEARCH_DIR_LIST = "SrchPluginsDistDL";
const NS_XPCOM_CURRENT_PROCESS_DIR = "XCurProcD";
const XRE_APP_DISTRIBUTION_DIR = "XREAppDist";
const XRE_UPDATE_ROOT_DIR = "UpdRootD";
const ENVVAR_UPDATE_DIR = "UPDATES_DIRECTORY";
const WEBAPPS_DIR = "webappsDir";
const SYSTEM_DIST_PATH = `/system/${AppConstants.ANDROID_PACKAGE_NAME}/distribution`;
function DirectoryProvider() {}
DirectoryProvider.prototype = {
classID: Components.ID("{ef0f7a87-c1ee-45a8-8d67-26f586e46a4b}"),
QueryInterface: ChromeUtils.generateQI([Ci.nsIDirectoryServiceProvider,
Ci.nsIDirectoryServiceProvider2]),
getFile: function(prop, persistent) {
if (prop == NS_APP_CACHE_PARENT_DIR) {
let profile = Services.dirsvc.get("ProfD", Ci.nsIFile);
return profile;
} else if (prop == WEBAPPS_DIR) {
// returns the folder that should hold the webapps database file
// For fennec we will store that in the root profile folder so that all
// webapps can easily access it
let profile = Services.dirsvc.get("ProfD", Ci.nsIFile);
return profile.parent;
} else if (prop == XRE_APP_DISTRIBUTION_DIR) {
let distributionDirectories = this._getDistributionDirectories();
for (let i = 0; i < distributionDirectories.length; i++) {
if (distributionDirectories[i].exists()) {
return distributionDirectories[i];
}
}
// Fallback: Return default data distribution directory
return FileUtils.getDir(NS_XPCOM_CURRENT_PROCESS_DIR, ["distribution"], false);
} else if (prop == XRE_UPDATE_ROOT_DIR) {
let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
if (env.exists(ENVVAR_UPDATE_DIR)) {
let path = env.get(ENVVAR_UPDATE_DIR);
if (path) {
return new FileUtils.File(path);
}
}
return new FileUtils.File(env.get("DOWNLOADS_DIRECTORY"));
}
// We are retuning null to show failure instead for throwing an error. The
// interface is called quite a bit and throwing an error is noisy. Returning
// null works with the way the interface is called [see bug 529077]
return null;
},
/**
* Appends the distribution-specific search engine directories to the array.
* The distribution directory structure is as follows:
*
* \- distribution/
* \- searchplugins/
* |- common/
* \- locale/
* |- <locale 1>/
* ...
* \- <locale N>/
*
* Common engines are loaded for all locales. If there is no locale directory for
* the current locale, there is a pref: "distribution.searchplugins.defaultLocale",
* which specifies a default locale to use.
*/
_appendDistroSearchDirs: function(array) {
let distro = this.getFile(XRE_APP_DISTRIBUTION_DIR);
if (!distro.exists())
return;
let searchPlugins = distro.clone();
searchPlugins.append("searchplugins");
if (!searchPlugins.exists())
return;
let commonPlugins = searchPlugins.clone();
commonPlugins.append("common");
if (commonPlugins.exists())
array.push(commonPlugins);
let localePlugins = searchPlugins.clone();
localePlugins.append("locale");
if (!localePlugins.exists())
return;
let curLocale = "";
let reqLocales = Services.locale.getRequestedLocales();
if (reqLocales.length > 0) {
curLocale = reqLocales[0];
}
if (curLocale) {
let curLocalePlugins = localePlugins.clone();
curLocalePlugins.append(curLocale);
if (curLocalePlugins.exists()) {
array.push(curLocalePlugins);
return;
}
}
// We didn't append the locale dir - try the default one.
try {
let defLocale = Services.prefs.getCharPref("distribution.searchplugins.defaultLocale");
let defLocalePlugins = localePlugins.clone();
defLocalePlugins.append(defLocale);
if (defLocalePlugins.exists())
array.push(defLocalePlugins);
} catch (e) {
}
},
getFiles: function(prop) {
if (prop != NS_APP_DISTRIBUTION_SEARCH_DIR_LIST)
return null;
let result = [];
this._appendDistroSearchDirs(result);
return {
QueryInterface: ChromeUtils.generateQI([Ci.nsISimpleEnumerator]),
hasMoreElements: function() {
return result.length > 0;
},
getNext: function() {
return result.shift();
}
};
},
_getDistributionDirectories: function() {
let directories = [];
// Send a synchronous Gecko thread event.
EventDispatcher.instance.dispatch("Distribution:GetDirectories", null, {
onSuccess: response =>
directories = response.map(dir => new FileUtils.File(dir)),
});
return directories;
}
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([DirectoryProvider]);