mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-29 10:32:23 +00:00
fe0509a62e
- Bug 904479 - Added createPromiseWithId() that returns id of resolver r=kanru,nsm (2ac672d882) - Bug 1166580 - Disable mozHasPendingMessage tests on non-browser platform. r=me (03c689964b) - Bug 1162281 - Invalid system message handler in an App Manifest can break the entire system. r=fabrice (e192a95f9c) - Bug 1198988 - Turn off some useless dump() calls r=ferjm (34fc83b236) - Bug 1164498: Remove |DispatchBluetoothReply|, r=btian (6143335efa) - Bug 1001757 - Add ability to store core apps outside of profile on desktop b2g; r=fabrice (f6b605e7aa) - Bug 1155245 - Set the app status correctly for hosted certified apps in developer mode. r=fabrice (131178b80e) - Bug 1179052 - Add some raptor markers to b2g gecko startup r=gwagner (222256fad8) - Bug 1163904 - handle -url command line argument. r=fabrice (ee61af1ff9) - Bug 1167275 - JS error in shell.js handleCmdLine() r=me (32e75c604f) - Bug 1167197 - Fix GMPProvider on Android r=cpearce Bug 1181209 - Make changes to Gecko needed for b2gdroid to boot. r=fabrice (b35d3a372f) - Bug 1158544 - Remove FTPChannelChild::mWasOpened and make the base class mWasOpened protected; r=mcmanus (9111e1bc00) - Bug 1171716 - Part 2: Use NS_ReleaseOnMainThread in nsBaseChannel. r=froydnj (f138124f14) - partial of Bug 1177175 - Add a UITour target inside the TP panel. (603cc719b3) - Bug 1175545 - Dont process alt-svc on 421 r=hurley (ad0f2f6e91) - Bug 1191291 - convert nsHttpChannel::RetargetDeliveryTo warning to log r=michal.novotny (b9c6003df8) - Bug 1182487 - Don't try to write to HTTP cache entry in nsHttpChannel when entry is open for reading only. r=michal (b36d7014a0) - Bug 1173069 - Don't accumulate the cache hit telemetry for intercepted channels; r=mayhemer,jdm (aaed79183d) - Bug 1208755 HttpBaseChannel::ShouldIntercept() should not assume every channel has a LoadInfo. r=ckerschb (d55be94901) - Bug 1201229 - Return an empty string for a header when an error occurs; r=dragana (256d0462c8) - Bug 1048048 - add preload content policy types - web platform test updates (r=dveditz) (baa1004dd6) - Bug 1048048 - add preload content policy types - csp changes (r=dveditz) (17914dadba) - Bug 1048048 - add preload content policy types for stylesheets (r=cam) (29af13263a) - Bug 1048048 - add preload content policy types (r=ehsan) (f58a32d51b) - Bug 1201747 - Don't inspect the subject principal in StorageAllowedForPrincipal. r=mystor (4f2c100882) - Bug 1176829 - Remove custom elements base element queue. r=smaug (03a520c13d) - Bug 1176829 follow-up, finish removing unused member to fix bustage. CLOSED TREE (29c6150af8) - Bug 1179909: Build fix. r=me CLOSED TREE (40e3bdb971) - Bug 1188932 - Allow the User-Agent header to be explicitly set by requests, r=bkelly, r=jgraham (37aacbd37d)
287 lines
9.7 KiB
JavaScript
287 lines
9.7 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/. */
|
|
|
|
const Cc = Components.classes;
|
|
const Ci = Components.interfaces;
|
|
const Cu = Components.utils;
|
|
const Cr = Components.results;
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
const XRE_OS_UPDATE_APPLY_TO_DIR = "OSUpdApplyToD"
|
|
const UPDATE_ARCHIVE_DIR = "UpdArchD"
|
|
const LOCAL_DIR = "/data/local";
|
|
const UPDATES_DIR = "updates/0";
|
|
const FOTA_DIR = "updates/fota";
|
|
const COREAPPSDIR_PREF = "b2g.coreappsdir"
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(Services, "env",
|
|
"@mozilla.org/process/environment;1",
|
|
"nsIEnvironment");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(Services, "um",
|
|
"@mozilla.org/updates/update-manager;1",
|
|
"nsIUpdateManager");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(Services, "volumeService",
|
|
"@mozilla.org/telephony/volume-service;1",
|
|
"nsIVolumeService");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
|
|
"@mozilla.org/childprocessmessagemanager;1",
|
|
"nsISyncMessageSender");
|
|
|
|
XPCOMUtils.defineLazyGetter(this, "gExtStorage", function dp_gExtStorage() {
|
|
return Services.env.get("EXTERNAL_STORAGE");
|
|
});
|
|
|
|
// This exists to mark the affected code for bug 828858.
|
|
const gUseSDCard = true;
|
|
|
|
const VERBOSE = 1;
|
|
let log =
|
|
VERBOSE ?
|
|
function log_dump(msg) { dump("DirectoryProvider: " + msg + "\n"); } :
|
|
function log_noop(msg) { };
|
|
|
|
function DirectoryProvider() {
|
|
}
|
|
|
|
DirectoryProvider.prototype = {
|
|
classID: Components.ID("{9181eb7c-6f87-11e1-90b1-4f59d80dd2e5}"),
|
|
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIDirectoryServiceProvider]),
|
|
_xpcom_factory: XPCOMUtils.generateSingletonFactory(DirectoryProvider),
|
|
|
|
_profD: null,
|
|
|
|
getFile: function dp_getFile(prop, persistent) {
|
|
#ifdef MOZ_WIDGET_GONK
|
|
let localProps = ["cachePDir", "webappsDir", "PrefD", "indexedDBPDir",
|
|
"permissionDBPDir", "UpdRootD"];
|
|
if (localProps.indexOf(prop) != -1) {
|
|
let file = Cc["@mozilla.org/file/local;1"]
|
|
.createInstance(Ci.nsILocalFile)
|
|
file.initWithPath(LOCAL_DIR);
|
|
persistent.value = true;
|
|
return file;
|
|
}
|
|
if (prop == "ProfD") {
|
|
let dir = Cc["@mozilla.org/file/local;1"]
|
|
.createInstance(Ci.nsILocalFile);
|
|
dir.initWithPath(LOCAL_DIR+"/tests/profile");
|
|
if (dir.exists()) {
|
|
persistent.value = true;
|
|
return dir;
|
|
}
|
|
}
|
|
if (prop == "coreAppsDir") {
|
|
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
|
|
file.initWithPath("/system/b2g");
|
|
persistent.value = true;
|
|
return file;
|
|
}
|
|
if (prop == UPDATE_ARCHIVE_DIR) {
|
|
// getUpdateDir will set persistent to false since it may toggle between
|
|
// /data/local/ and /mnt/sdcard based on free space and/or availability
|
|
// of the sdcard.
|
|
// before download, check if free space is 2.1 times of update.mar
|
|
return this.getUpdateDir(persistent, UPDATES_DIR, 2.1);
|
|
}
|
|
if (prop == XRE_OS_UPDATE_APPLY_TO_DIR) {
|
|
// getUpdateDir will set persistent to false since it may toggle between
|
|
// /data/local/ and /mnt/sdcard based on free space and/or availability
|
|
// of the sdcard.
|
|
// before apply, check if free space is 1.1 times of update.mar
|
|
return this.getUpdateDir(persistent, FOTA_DIR, 1.1);
|
|
}
|
|
#else
|
|
// In desktop builds, coreAppsDir is the same as the profile
|
|
// directory unless otherwise specified. We just need to get the
|
|
// path from the parent, and it is then used to build
|
|
// jar:remoteopenfile:// uris.
|
|
if (prop == "coreAppsDir") {
|
|
let coreAppsDirPref;
|
|
try {
|
|
coreAppsDirPref = Services.prefs.getCharPref(COREAPPSDIR_PREF);
|
|
} catch (e) {
|
|
// coreAppsDirPref may not exist if we're on an older version
|
|
// of gaia, so just fail silently.
|
|
}
|
|
let appsDir;
|
|
// If pref doesn't exist or isn't set, default to old value
|
|
if (!coreAppsDirPref || coreAppsDirPref == "") {
|
|
appsDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
|
|
appsDir.append("webapps");
|
|
} else {
|
|
appsDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
|
|
appsDir.initWithPath(coreAppsDirPref);
|
|
}
|
|
persistent.value = true;
|
|
return appsDir;
|
|
} else if (prop == "ProfD") {
|
|
let inParent = Cc["@mozilla.org/xre/app-info;1"]
|
|
.getService(Ci.nsIXULRuntime)
|
|
.processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
|
|
if (inParent) {
|
|
// Just bail out to use the default from toolkit.
|
|
return null;
|
|
}
|
|
if (!this._profD) {
|
|
this._profD = cpmm.sendSyncMessage("getProfD", {})[0];
|
|
}
|
|
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
|
|
file.initWithPath(this._profD);
|
|
persistent.value = true;
|
|
return file;
|
|
}
|
|
#endif
|
|
return null;
|
|
},
|
|
|
|
// The VolumeService only exists on the device, and not on desktop
|
|
volumeHasFreeSpace: function dp_volumeHasFreeSpace(volumePath, requiredSpace) {
|
|
if (!volumePath) {
|
|
return false;
|
|
}
|
|
if (!Services.volumeService) {
|
|
return false;
|
|
}
|
|
let volume = Services.volumeService.createOrGetVolumeByPath(volumePath);
|
|
if (!volume || volume.state !== Ci.nsIVolume.STATE_MOUNTED) {
|
|
return false;
|
|
}
|
|
let stat = volume.getStats();
|
|
if (!stat) {
|
|
return false;
|
|
}
|
|
return requiredSpace <= stat.freeBytes;
|
|
},
|
|
|
|
findUpdateDirWithFreeSpace: function dp_findUpdateDirWithFreeSpace(requiredSpace, subdir) {
|
|
if (!Services.volumeService) {
|
|
return this.createUpdatesDir(LOCAL_DIR, subdir);
|
|
}
|
|
|
|
let activeUpdate = Services.um.activeUpdate;
|
|
if (gUseSDCard) {
|
|
if (this.volumeHasFreeSpace(gExtStorage, requiredSpace)) {
|
|
let extUpdateDir = this.createUpdatesDir(gExtStorage, subdir);
|
|
if (extUpdateDir !== null) {
|
|
return extUpdateDir;
|
|
}
|
|
log("Warning: " + gExtStorage + " has enough free space for update " +
|
|
activeUpdate.name + ", but is not writable");
|
|
}
|
|
}
|
|
|
|
if (this.volumeHasFreeSpace(LOCAL_DIR, requiredSpace)) {
|
|
let localUpdateDir = this.createUpdatesDir(LOCAL_DIR, subdir);
|
|
if (localUpdateDir !== null) {
|
|
return localUpdateDir;
|
|
}
|
|
log("Warning: " + LOCAL_DIR + " has enough free space for update " +
|
|
activeUpdate.name + ", but is not writable");
|
|
}
|
|
|
|
return null;
|
|
},
|
|
|
|
getUpdateDir: function dp_getUpdateDir(persistent, subdir, multiple) {
|
|
let defaultUpdateDir = this.getDefaultUpdateDir();
|
|
persistent.value = false;
|
|
|
|
let activeUpdate = Services.um.activeUpdate;
|
|
if (!activeUpdate) {
|
|
log("Warning: No active update found, using default update dir: " +
|
|
defaultUpdateDir);
|
|
return defaultUpdateDir;
|
|
}
|
|
|
|
let selectedPatch = activeUpdate.selectedPatch;
|
|
if (!selectedPatch) {
|
|
log("Warning: No selected patch, using default update dir: " +
|
|
defaultUpdateDir);
|
|
return defaultUpdateDir;
|
|
}
|
|
|
|
let requiredSpace = selectedPatch.size * multiple;
|
|
let updateDir = this.findUpdateDirWithFreeSpace(requiredSpace, subdir);
|
|
if (updateDir) {
|
|
return updateDir;
|
|
}
|
|
|
|
// If we've gotten this far, there isn't enough free space to download the patch
|
|
// on either external storage or /data/local. All we can do is report the
|
|
// error and let upstream code handle it more gracefully.
|
|
log("Error: No volume found with " + requiredSpace + " bytes for downloading"+
|
|
" update " + activeUpdate.name);
|
|
activeUpdate.errorCode = Cr.NS_ERROR_FILE_TOO_BIG;
|
|
return null;
|
|
},
|
|
|
|
createUpdatesDir: function dp_createUpdatesDir(root, subdir) {
|
|
let dir = Cc["@mozilla.org/file/local;1"]
|
|
.createInstance(Ci.nsILocalFile);
|
|
dir.initWithPath(root);
|
|
if (!dir.isWritable()) {
|
|
log("Error: " + dir.path + " isn't writable");
|
|
return null;
|
|
}
|
|
dir.appendRelativePath(subdir);
|
|
if (dir.exists()) {
|
|
if (dir.isDirectory() && dir.isWritable()) {
|
|
return dir;
|
|
}
|
|
// subdir is either a file or isn't writable. In either case we
|
|
// can't use it.
|
|
log("Error: " + dir.path + " is a file or isn't writable");
|
|
return null;
|
|
}
|
|
// subdir doesn't exist, and the parent is writable, so try to
|
|
// create it. This can fail if a file named updates exists.
|
|
try {
|
|
dir.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt('0770', 8));
|
|
} catch (e) {
|
|
// The create failed for some reason. We can't use it.
|
|
log("Error: " + dir.path + " unable to create directory");
|
|
return null;
|
|
}
|
|
return dir;
|
|
},
|
|
|
|
getDefaultUpdateDir: function dp_getDefaultUpdateDir() {
|
|
let path = gExtStorage;
|
|
if (!path) {
|
|
path = LOCAL_DIR;
|
|
}
|
|
|
|
if (Services.volumeService) {
|
|
let extVolume = Services.volumeService.createOrGetVolumeByPath(path);
|
|
if (!extVolume) {
|
|
path = LOCAL_DIR;
|
|
}
|
|
}
|
|
|
|
let dir = Cc["@mozilla.org/file/local;1"]
|
|
.createInstance(Ci.nsILocalFile)
|
|
dir.initWithPath(path);
|
|
|
|
if (!dir.exists() && path != LOCAL_DIR) {
|
|
// Fallback to LOCAL_DIR if we didn't fallback earlier
|
|
dir.initWithPath(LOCAL_DIR);
|
|
|
|
if (!dir.exists()) {
|
|
throw Cr.NS_ERROR_FILE_NOT_FOUND;
|
|
}
|
|
}
|
|
|
|
dir.appendRelativePath("updates");
|
|
return dir;
|
|
}
|
|
};
|
|
|
|
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([DirectoryProvider]);
|