зеркало из https://github.com/mozilla/gecko-dev.git
Bug 620931 part 3 - Allow GRE and XUL application to use omni.jar independently. r=bsmedberg,r=mwu
We now store two independent locations for an omni.jar, allowing GRE/XRE and XUL application to each have their own omni.jar. And since xulrunner setups are very independent from the XUL applications, we implement support for both omni.jar and non omni.jar cases in the same runtime, with the side effect of allowing to switch from one to the other manually without rebuilding the binaries. We let the mozilla::Omnijar API handle both cases, so that callers don't need too much work to support them. We also make the preferences service load the same set of preferences in all the various cases (unified vs. separate, omni.jar vs. no omni.jar). The child process launcher for IPC is modified to pass the base directories needed for the mozilla::Omnijar API initialization in the child process. Finally, the startupcache file name canonicalization is modified to separate APP and GRE resources.
This commit is contained in:
Родитель
9059971f1e
Коммит
a1c93a6f14
|
@ -377,7 +377,7 @@ public class GeckoAppShell
|
|||
GeckoAppShell.setSurfaceView(GeckoApp.surfaceView);
|
||||
|
||||
// First argument is the .apk path
|
||||
String combinedArgs = apkPath + " -omnijar " + apkPath;
|
||||
String combinedArgs = apkPath + " -greomni " + apkPath;
|
||||
if (args != null)
|
||||
combinedArgs += " " + args;
|
||||
if (url != null)
|
||||
|
|
|
@ -492,16 +492,19 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector<std::string>& aExt
|
|||
|
||||
childArgv.insert(childArgv.end(), aExtraOpts.begin(), aExtraOpts.end());
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
// Make sure the child process can find the omnijar
|
||||
// See XRE_InitCommandLine in nsAppRunner.cpp
|
||||
nsCAutoString omnijarPath;
|
||||
if (mozilla::OmnijarPath()) {
|
||||
mozilla::OmnijarPath()->GetNativePath(omnijarPath);
|
||||
childArgv.push_back("-omnijar");
|
||||
childArgv.push_back(omnijarPath.get());
|
||||
nsCAutoString path;
|
||||
nsCOMPtr<nsIFile> file = mozilla::Omnijar::GetPath(mozilla::Omnijar::GRE);
|
||||
if (file && NS_SUCCEEDED(file->GetNativePath(path))) {
|
||||
childArgv.push_back("-greomni");
|
||||
childArgv.push_back(path.get());
|
||||
}
|
||||
file = mozilla::Omnijar::GetPath(mozilla::Omnijar::APP);
|
||||
if (file && NS_SUCCEEDED(file->GetNativePath(path))) {
|
||||
childArgv.push_back("-appomni");
|
||||
childArgv.push_back(path.get());
|
||||
}
|
||||
#endif
|
||||
|
||||
childArgv.push_back(pidstring);
|
||||
|
||||
|
@ -604,16 +607,19 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector<std::string>& aExt
|
|||
|
||||
cmdLine.AppendLooseValue(std::wstring(mGroupId.get()));
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
// Make sure the child process can find the omnijar
|
||||
// See XRE_InitCommandLine in nsAppRunner.cpp
|
||||
nsAutoString omnijarPath;
|
||||
if (mozilla::OmnijarPath()) {
|
||||
mozilla::OmnijarPath()->GetPath(omnijarPath);
|
||||
cmdLine.AppendLooseValue(UTF8ToWide("-omnijar"));
|
||||
cmdLine.AppendLooseValue(omnijarPath.get());
|
||||
nsAutoString path;
|
||||
nsCOMPtr<nsIFile> file = mozilla::Omnijar::GetPath(mozilla::Omnijar::GRE);
|
||||
if (file && NS_SUCCEEDED(file->GetPath(path))) {
|
||||
cmdLine.AppendLooseValue(UTF8ToWide("-greomni"));
|
||||
cmdLine.AppendLooseValue(path.get());
|
||||
}
|
||||
file = mozilla::Omnijar::GetPath(mozilla::Omnijar::APP);
|
||||
if (file && NS_SUCCEEDED(file->GetPath(path))) {
|
||||
cmdLine.AppendLooseValue(UTF8ToWide("-appomni"));
|
||||
cmdLine.AppendLooseValue(path.get());
|
||||
}
|
||||
#endif
|
||||
|
||||
cmdLine.AppendLooseValue(UTF8ToWide(pidstring));
|
||||
|
||||
|
|
|
@ -84,6 +84,7 @@
|
|||
#include "nsILocalFileWin.h"
|
||||
#endif
|
||||
#include "xpcprivate.h"
|
||||
#include "nsIResProtocolHandler.h"
|
||||
|
||||
#ifdef MOZ_ENABLE_LIBXUL
|
||||
#include "mozilla/scache/StartupCache.h"
|
||||
|
@ -621,24 +622,11 @@ mozJSComponentLoader::LoadModuleFromJAR(nsILocalFile *aJarFile,
|
|||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCAutoString fullSpec;
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
PRBool equal;
|
||||
rv = aJarFile->Equals(mozilla::OmnijarPath(), &equal);
|
||||
if (NS_SUCCEEDED(rv) && equal) {
|
||||
fullSpec = "resource://gre/";
|
||||
} else {
|
||||
#endif
|
||||
nsCAutoString fileSpec;
|
||||
NS_GetURLSpecFromActualFile(aJarFile, fileSpec);
|
||||
fullSpec = "jar:";
|
||||
fullSpec += fileSpec;
|
||||
fullSpec += "!/";
|
||||
#ifdef MOZ_OMNIJAR
|
||||
}
|
||||
#endif
|
||||
|
||||
nsCAutoString fullSpec, fileSpec;
|
||||
NS_GetURLSpecFromActualFile(aJarFile, fileSpec);
|
||||
fullSpec = "jar:";
|
||||
fullSpec += fileSpec;
|
||||
fullSpec += "!/";
|
||||
fullSpec += aComponentPath;
|
||||
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
|
@ -819,47 +807,128 @@ class JSPrincipalsHolder
|
|||
JSPrincipals *mPrincipals;
|
||||
};
|
||||
|
||||
static const char baseName[2][5] = { "gre/", "app/" };
|
||||
|
||||
static inline PRBool
|
||||
canonicalizeBase(nsCAutoString &spec, nsACString &out, mozilla::Omnijar::Type aType)
|
||||
{
|
||||
nsCAutoString base;
|
||||
nsresult rv = mozilla::Omnijar::GetURIString(aType, base);
|
||||
|
||||
if (NS_FAILED(rv) || !base.Length())
|
||||
return PR_FALSE;
|
||||
|
||||
if (base.Compare(spec.get(), PR_FALSE, base.Length()))
|
||||
return PR_FALSE;
|
||||
|
||||
out.Append("/resource/");
|
||||
out.Append(baseName[aType]);
|
||||
out.Append(Substring(spec, base.Length()));
|
||||
return PR_TRUE;
|
||||
}
|
||||
/**
|
||||
* PathifyURI transforms mozilla .js uris into useful zip paths
|
||||
* to make it makes it easier to manipulate startup cache entries
|
||||
* using standard zip tools.
|
||||
* Transformations applied:
|
||||
* * jsloader/<scheme> prefix is used to group mozJSComponentLoader cache entries in
|
||||
* * jsloader/ prefix is used to group mozJSComponentLoader cache entries in
|
||||
* a top-level zip directory.
|
||||
* * In MOZ_OMNIJAR case resource:/// and resource://gre/ URIs refer to the same path
|
||||
* so treat both of them as resource://gre/
|
||||
* * resource:// URIs are resolved to their corresponding file/jar URI to
|
||||
* canonicalize resources URIs other than gre and app.
|
||||
* * Paths under GRE or APP directory have their base path replaced with
|
||||
* resource/gre or resource/app to avoid depending on install location.
|
||||
* * jar:file:///path/to/file.jar!/sub/path urls are replaced with
|
||||
* /path/to/file.jar/sub/path
|
||||
* * .bin suffix is added to the end of the path to indicate that jsloader/ entries
|
||||
* are binary representations of JS source.
|
||||
* For example:
|
||||
* resource://gre/modules/XPCOMUtils.jsm becomes
|
||||
* jsloader/resource/gre/modules/XPCOMUtils.jsm.bin
|
||||
* resource://gre/modules/XPCOMUtils.jsm or
|
||||
* file://$GRE_DIR/modules/XPCOMUtils.jsm or
|
||||
* jar:file://$GRE_DIR/omni.jar!/modules/XPCOMUtils.jsm become
|
||||
* jsloader/resource/gre/modules/XPCOMUtils.jsm.bin
|
||||
* file://$PROFILE_DIR/extensions/{uuid}/components/component.js becomes
|
||||
* jsloader/$PROFILE_DIR/extensions/%7Buuid%7D/components/component.js.bin
|
||||
* jar:file://$PROFILE_DIR/extensions/some.xpi!/components/component.js becomes
|
||||
* jsloader/$PROFILE_DIR/extensions/some.xpi/components/component.js.bin
|
||||
*/
|
||||
static nsresult
|
||||
PathifyURI(nsIURI *in, nsACString &out)
|
||||
{
|
||||
out = "jsloader/";
|
||||
nsCAutoString scheme;
|
||||
nsresult rv = in->GetScheme(scheme);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
out.Append(scheme);
|
||||
nsCAutoString host;
|
||||
// OK for GetHost to fail since it's not implemented sometimes
|
||||
in->GetHost(host);
|
||||
#ifdef MOZ_OMNIJAR
|
||||
if (scheme.Equals("resource") && host.Length() == 0){
|
||||
host = "gre";
|
||||
}
|
||||
#endif
|
||||
if (host.Length()) {
|
||||
out.Append("/");
|
||||
out.Append(host);
|
||||
}
|
||||
nsCAutoString path;
|
||||
rv = in->GetPath(path);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
out.Append(path);
|
||||
out.Append(".bin");
|
||||
return NS_OK;
|
||||
PRBool equals;
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIURI> uri = in;
|
||||
nsCAutoString spec;
|
||||
|
||||
out = "jsloader";
|
||||
|
||||
// Resolve resource:// URIs. At the end of this if/else block, we
|
||||
// have both spec and uri variables identifying the same URI.
|
||||
if (NS_SUCCEEDED(in->SchemeIs("resource", &equals)) && equals) {
|
||||
nsCOMPtr<nsIIOService> ioService = do_GetIOService(&rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIProtocolHandler> ph;
|
||||
rv = ioService->GetProtocolHandler("resource", getter_AddRefs(ph));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIResProtocolHandler> irph(do_QueryInterface(ph, &rv));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = irph->ResolveURI(in, spec);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = ioService->NewURI(spec, nsnull, nsnull, getter_AddRefs(uri));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
} else {
|
||||
rv = in->GetSpec(spec);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
if (!canonicalizeBase(spec, out, mozilla::Omnijar::GRE) &&
|
||||
!canonicalizeBase(spec, out, mozilla::Omnijar::APP)) {
|
||||
if (NS_SUCCEEDED(uri->SchemeIs("file", &equals)) && equals) {
|
||||
nsCOMPtr<nsIFileURL> baseFileURL;
|
||||
baseFileURL = do_QueryInterface(uri, &rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCAutoString path;
|
||||
rv = baseFileURL->GetPath(path);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
out.Append(path);
|
||||
} else if (NS_SUCCEEDED(uri->SchemeIs("jar", &equals)) && equals) {
|
||||
nsCOMPtr<nsIJARURI> jarURI = do_QueryInterface(uri, &rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIURI> jarFileURI;
|
||||
rv = jarURI->GetJARFile(getter_AddRefs(jarFileURI));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIFileURL> jarFileURL;
|
||||
jarFileURL = do_QueryInterface(jarFileURI, &rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCAutoString path;
|
||||
rv = jarFileURL->GetPath(path);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
out.Append(path);
|
||||
|
||||
rv = jarURI->GetJAREntry(path);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
out.Append("/");
|
||||
out.Append(path);
|
||||
} else { // Very unlikely
|
||||
nsCAutoString spec;
|
||||
rv = uri->GetSpec(spec);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
out.Append("/");
|
||||
out.Append(spec);
|
||||
}
|
||||
}
|
||||
|
||||
out.Append(".bin");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* static */
|
||||
|
|
|
@ -177,16 +177,13 @@ nsJAR::Open(nsIFile* zipFile)
|
|||
mOuterZipEntry.Truncate();
|
||||
mOpened = PR_TRUE;
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
// The omnijar is special, it is opened early on and closed late
|
||||
// this avoids reopening it
|
||||
PRBool equals;
|
||||
nsresult rv = zipFile->Equals(mozilla::OmnijarPath(), &equals);
|
||||
if (NS_SUCCEEDED(rv) && equals) {
|
||||
mZip = mozilla::OmnijarReader();
|
||||
nsZipArchive *zip = mozilla::Omnijar::GetReader(zipFile);
|
||||
if (zip) {
|
||||
mZip = zip;
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
return mZip->OpenArchive(zipFile);
|
||||
}
|
||||
|
||||
|
@ -235,13 +232,12 @@ nsJAR::Close()
|
|||
mGlobalStatus = JAR_MANIFEST_NOT_PARSED;
|
||||
mTotalItemsInManifest = 0;
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
if (mZip == mozilla::OmnijarReader()) {
|
||||
if ((mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE)) ||
|
||||
(mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::APP))) {
|
||||
mZip.forget();
|
||||
mZip = new nsZipArchive();
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
return mZip->CloseArchive();
|
||||
}
|
||||
|
||||
|
@ -392,12 +388,11 @@ nsJAR::GetCertificatePrincipal(const char* aFilename, nsIPrincipal** aPrincipal)
|
|||
return NS_ERROR_NULL_POINTER;
|
||||
*aPrincipal = nsnull;
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
// Don't check signatures in the omnijar - this is only
|
||||
// interesting for extensions/XPIs.
|
||||
if (mZip == mozilla::OmnijarReader())
|
||||
if ((mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE)) ||
|
||||
(mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::APP)))
|
||||
return NS_OK;
|
||||
#endif
|
||||
|
||||
//-- Parse the manifest
|
||||
nsresult rv = ParseManifest();
|
||||
|
|
|
@ -70,10 +70,8 @@
|
|||
|
||||
#include "nsITimelineService.h"
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
#include "mozilla/Omnijar.h"
|
||||
#include "nsZipArchive.h"
|
||||
#endif
|
||||
|
||||
// Definitions
|
||||
#define INITIAL_PREF_FILES 10
|
||||
|
@ -784,30 +782,6 @@ static nsresult pref_LoadPrefsInDirList(const char *listId)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------
|
||||
// Initialize default preference JavaScript buffers from
|
||||
// appropriate TEXT resources
|
||||
//----------------------------------------------------------------------------------------
|
||||
static nsresult pref_InitDefaults()
|
||||
{
|
||||
nsCOMPtr<nsIFile> greprefsFile;
|
||||
nsresult rv;
|
||||
|
||||
rv = NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(greprefsFile));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = greprefsFile->AppendNative(NS_LITERAL_CSTRING("greprefs.js"));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = openPrefFile(greprefsFile);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_WARNING("Error parsing GRE default preferences. Is this an old-style embedding app?");
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name)
|
||||
{
|
||||
nsZipItemPtr<char> manifest(jarReader, name, true);
|
||||
|
@ -821,77 +795,121 @@ static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name)
|
|||
return rv;
|
||||
}
|
||||
|
||||
static nsresult pref_InitAppDefaultsFromOmnijar()
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsZipArchive* jarReader = mozilla::OmnijarReader();
|
||||
if (!jarReader)
|
||||
return pref_InitDefaults();
|
||||
|
||||
rv = pref_ReadPrefFromJar(jarReader, "greprefs.js");
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsZipFind *findPtr;
|
||||
rv = jarReader->FindInit("defaults/pref/*.js$", &findPtr);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsAutoPtr<nsZipFind> find(findPtr);
|
||||
|
||||
nsTArray<nsCString> prefEntries;
|
||||
const char *entryName;
|
||||
PRUint16 entryNameLen;
|
||||
while (NS_SUCCEEDED(find->FindNext(&entryName, &entryNameLen))) {
|
||||
prefEntries.AppendElement(Substring(entryName, entryName + entryNameLen));
|
||||
}
|
||||
|
||||
prefEntries.Sort();
|
||||
for (PRUint32 i = prefEntries.Length(); i--; ) {
|
||||
rv = pref_ReadPrefFromJar(jarReader, prefEntries[i].get());
|
||||
if (NS_FAILED(rv))
|
||||
NS_WARNING("Error parsing preferences.");
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------------------------
|
||||
// Initialize default preference JavaScript buffers from
|
||||
// appropriate TEXT resources
|
||||
//----------------------------------------------------------------------------------------
|
||||
static nsresult pref_InitInitialObjects()
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
// first we parse the GRE default prefs. This also works if we're not using a GRE,
|
||||
#ifdef MOZ_OMNIJAR
|
||||
rv = pref_InitAppDefaultsFromOmnijar();
|
||||
#else
|
||||
rv = pref_InitDefaults();
|
||||
#endif
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
// In omni.jar case, we load the following prefs:
|
||||
// - jar:$gre/omni.jar!/greprefs.js
|
||||
// - jar:$gre/omni.jar!/defaults/pref/*.js
|
||||
// In non omni.jar case, we load:
|
||||
// - $gre/greprefs.js
|
||||
//
|
||||
// When $app == $gre, we additionally load, in all cases:
|
||||
// - $gre/defaults/pref/*.js
|
||||
// This is kept for bug 591866 (channel-prefs.js should not be in omni.jar).
|
||||
// We load all files instead of channel-prefs.js only to have the same
|
||||
// behaviour as $app != $gre.
|
||||
//
|
||||
// When $app != $gre, we additionally load, in omni.jar case:
|
||||
// - jar:$app/omni.jar!/defaults/preferences/*.js
|
||||
// - $app/defaults/preferences/*.js
|
||||
// and in non omni.jar case:
|
||||
// - $app/defaults/preferences/*.js
|
||||
|
||||
nsCOMPtr<nsIFile> defaultPrefDir;
|
||||
// now parse the "application" default preferences
|
||||
rv = NS_GetSpecialDirectory(NS_APP_PREF_DEFAULTS_50_DIR, getter_AddRefs(defaultPrefDir));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsZipFind *findPtr;
|
||||
nsAutoPtr<nsZipFind> find;
|
||||
nsTArray<nsCString> prefEntries;
|
||||
const char *entryName;
|
||||
PRUint16 entryNameLen;
|
||||
|
||||
/* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */
|
||||
static const char* specialFiles[] = {
|
||||
nsZipArchive* jarReader = mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE);
|
||||
if (jarReader) {
|
||||
// Load jar:$gre/omni.jar!/greprefs.js
|
||||
rv = pref_ReadPrefFromJar(jarReader, "greprefs.js");
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// Load jar:$gre/omni.jar!/defaults/pref/*.js
|
||||
rv = jarReader->FindInit("defaults/pref/*.js$", &findPtr);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
find = findPtr;
|
||||
while (NS_SUCCEEDED(find->FindNext(&entryName, &entryNameLen))) {
|
||||
prefEntries.AppendElement(Substring(entryName, entryName + entryNameLen));
|
||||
}
|
||||
|
||||
prefEntries.Sort();
|
||||
for (PRUint32 i = prefEntries.Length(); i--; ) {
|
||||
rv = pref_ReadPrefFromJar(jarReader, prefEntries[i].get());
|
||||
if (NS_FAILED(rv))
|
||||
NS_WARNING("Error parsing preferences.");
|
||||
}
|
||||
} else {
|
||||
// Load $gre/greprefs.js
|
||||
nsCOMPtr<nsIFile> greprefsFile;
|
||||
rv = NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(greprefsFile));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = greprefsFile->AppendNative(NS_LITERAL_CSTRING("greprefs.js"));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = openPrefFile(greprefsFile);
|
||||
if (NS_FAILED(rv))
|
||||
NS_WARNING("Error parsing GRE default preferences. Is this an old-style embedding app?");
|
||||
}
|
||||
|
||||
if (!mozilla::Omnijar::HasOmnijar(mozilla::Omnijar::APP)) {
|
||||
// Load $gre/defaults/pref/*.js
|
||||
nsCOMPtr<nsIFile> defaultPrefDir;
|
||||
|
||||
rv = NS_GetSpecialDirectory(NS_APP_PREF_DEFAULTS_50_DIR, getter_AddRefs(defaultPrefDir));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
/* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */
|
||||
static const char* specialFiles[] = {
|
||||
#if defined(XP_MAC) || defined(XP_MACOSX)
|
||||
"macprefs.js"
|
||||
#elif defined(XP_WIN)
|
||||
"winpref.js"
|
||||
#elif defined(XP_UNIX)
|
||||
"unix.js"
|
||||
#if defined(_AIX)
|
||||
#if defined(VMS)
|
||||
, "openvms.js"
|
||||
#elif defined(_AIX)
|
||||
, "aix.js"
|
||||
#endif
|
||||
#elif defined(XP_OS2)
|
||||
"os2pref.js"
|
||||
#elif defined(XP_BEOS)
|
||||
"beos.js"
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
rv = pref_LoadPrefsInDir(defaultPrefDir, specialFiles, NS_ARRAY_LENGTH(specialFiles));
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_WARNING("Error parsing application default preferences.");
|
||||
rv = pref_LoadPrefsInDir(defaultPrefDir, specialFiles, NS_ARRAY_LENGTH(specialFiles));
|
||||
if (NS_FAILED(rv))
|
||||
NS_WARNING("Error parsing application default preferences.");
|
||||
}
|
||||
|
||||
// Load jar:$app/omni.jar!/defaults/preferences/*.js
|
||||
nsZipArchive *appJarReader = mozilla::Omnijar::GetReader(mozilla::Omnijar::APP);
|
||||
if (appJarReader) {
|
||||
rv = appJarReader->FindInit("defaults/preferences/*.js$", &findPtr);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
find = findPtr;
|
||||
prefEntries.Clear();
|
||||
while (NS_SUCCEEDED(find->FindNext(&entryName, &entryNameLen))) {
|
||||
prefEntries.AppendElement(Substring(entryName, entryName + entryNameLen));
|
||||
}
|
||||
prefEntries.Sort();
|
||||
for (PRUint32 i = prefEntries.Length(); i--; ) {
|
||||
rv = pref_ReadPrefFromJar(appJarReader, prefEntries[i].get());
|
||||
if (NS_FAILED(rv))
|
||||
NS_WARNING("Error parsing preferences.");
|
||||
}
|
||||
}
|
||||
|
||||
rv = pref_LoadPrefsInDirList(NS_APP_PREFS_DEFAULTS_DIR_LIST);
|
||||
|
|
|
@ -153,20 +153,6 @@ nsResProtocolHandler::~nsResProtocolHandler()
|
|||
gResHandler = nsnull;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsResProtocolHandler::AddSpecialDir(const char* aSpecialDir, const nsACString& aSubstitution)
|
||||
{
|
||||
nsCOMPtr<nsIFile> file;
|
||||
nsresult rv = NS_GetSpecialDirectory(aSpecialDir, getter_AddRefs(file));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
rv = mIOService->NewFileURI(file, getter_AddRefs(uri));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return SetSubstitution(aSubstitution, uri);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsResProtocolHandler::Init()
|
||||
{
|
||||
|
@ -178,24 +164,31 @@ nsResProtocolHandler::Init()
|
|||
mIOService = do_GetIOService(&rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
nsCOMPtr<nsIFile> omniJar(mozilla::OmnijarPath());
|
||||
if (omniJar)
|
||||
return Init(omniJar);
|
||||
#endif
|
||||
|
||||
// these entries should be kept in sync with the omnijar Init function
|
||||
nsCAutoString appURI, greURI;
|
||||
rv = mozilla::Omnijar::GetURIString(mozilla::Omnijar::APP, appURI);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = mozilla::Omnijar::GetURIString(mozilla::Omnijar::GRE, greURI);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
//
|
||||
// make resource:/// point to the application directory
|
||||
// make resource:/// point to the application directory or omnijar
|
||||
//
|
||||
rv = AddSpecialDir(NS_OS_CURRENT_PROCESS_DIR, EmptyCString());
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
rv = NS_NewURI(getter_AddRefs(uri), appURI.Length() ? appURI : greURI);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = SetSubstitution(EmptyCString(), uri);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
//
|
||||
// make resource://gre/ point to the GRE directory
|
||||
//
|
||||
rv = AddSpecialDir(NS_GRE_DIR, kGRE);
|
||||
if (appURI.Length()) { // We already have greURI in uri if appURI.Length() is 0.
|
||||
rv = NS_NewURI(getter_AddRefs(uri), greURI);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
rv = SetSubstitution(kGRE, uri);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
//XXXbsmedberg Neil wants a resource://pchrome/ for the profile chrome dir...
|
||||
|
@ -207,34 +200,6 @@ nsResProtocolHandler::Init()
|
|||
return rv;
|
||||
}
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
nsresult
|
||||
nsResProtocolHandler::Init(nsIFile *aOmniJar)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
nsCAutoString omniJarSpec;
|
||||
NS_GetURLSpecFromActualFile(aOmniJar, omniJarSpec, mIOService);
|
||||
|
||||
nsCAutoString urlStr("jar:");
|
||||
urlStr += omniJarSpec;
|
||||
urlStr += "!/";
|
||||
|
||||
rv = mIOService->NewURI(urlStr, nsnull, nsnull, getter_AddRefs(uri));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// these entries should be kept in sync with the normal Init function
|
||||
|
||||
// resource:/// points to jar:omni.jar!/
|
||||
SetSubstitution(EmptyCString(), uri);
|
||||
|
||||
// resource://gre/ points to jar:omni.jar!/
|
||||
SetSubstitution(kGRE, uri);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
static PLDHashOperator
|
||||
EnumerateSubstitution(const nsACString& aKey,
|
||||
nsIURI* aURI,
|
||||
|
|
|
@ -767,7 +767,7 @@ ChildProcessInit(int argc, char* argv[])
|
|||
{
|
||||
int i;
|
||||
for (i = 0; i < (argc - 1); i++) {
|
||||
if (strcmp(argv[i], "-omnijar"))
|
||||
if (strcmp(argv[i], "-greomni"))
|
||||
continue;
|
||||
|
||||
i = i + 1;
|
||||
|
|
|
@ -250,17 +250,26 @@ StartupCache::GetBuffer(const char* id, char** outbuf, PRUint32* length)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
if (mozilla::OmnijarReader()) {
|
||||
if (mozilla::Omnijar::GetReader(mozilla::Omnijar::APP)) {
|
||||
// no need to checksum omnijarred entries
|
||||
nsZipItemPtr<char> zipItem(mozilla::OmnijarReader(), id);
|
||||
nsZipItemPtr<char> zipItem(mozilla::Omnijar::GetReader(mozilla::Omnijar::APP), id);
|
||||
if (zipItem) {
|
||||
*outbuf = zipItem.Forget();
|
||||
*length = zipItem.Length();
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE)) {
|
||||
// no need to checksum omnijarred entries
|
||||
nsZipItemPtr<char> zipItem(mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE), id);
|
||||
if (zipItem) {
|
||||
*outbuf = zipItem.Forget();
|
||||
*length = zipItem.Length();
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
|
|
|
@ -3826,24 +3826,39 @@ XRE_InitCommandLine(int aArgc, char* aArgv[])
|
|||
delete[] canonArgs;
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
const char *omnijarPath = nsnull;
|
||||
ArgResult ar = CheckArg("omnijar", PR_FALSE, &omnijarPath);
|
||||
const char *path = nsnull;
|
||||
ArgResult ar = CheckArg("greomni", PR_FALSE, &path);
|
||||
if (ar == ARG_BAD) {
|
||||
PR_fprintf(PR_STDERR, "Error: argument -omnijar requires an omnijar path\n");
|
||||
PR_fprintf(PR_STDERR, "Error: argument -greomni requires a path argument\n");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
if (!omnijarPath)
|
||||
if (!path)
|
||||
return rv;
|
||||
|
||||
nsCOMPtr<nsILocalFile> omnijar;
|
||||
rv = NS_NewNativeLocalFile(nsDependentCString(omnijarPath), PR_TRUE,
|
||||
getter_AddRefs(omnijar));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
mozilla::SetOmnijar(omnijar);
|
||||
#endif
|
||||
nsCOMPtr<nsILocalFile> greOmni;
|
||||
rv = XRE_GetFileFromPath(path, getter_AddRefs(greOmni));
|
||||
if (NS_FAILED(rv)) {
|
||||
PR_fprintf(PR_STDERR, "Error: argument -greomni requires a valid path\n");
|
||||
return rv;
|
||||
}
|
||||
|
||||
ar = CheckArg("appomni", PR_FALSE, &path);
|
||||
if (ar == ARG_BAD) {
|
||||
PR_fprintf(PR_STDERR, "Error: argument -appomni requires a path argument\n");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsILocalFile> appOmni;
|
||||
if (path) {
|
||||
rv = XRE_GetFileFromPath(path, getter_AddRefs(appOmni));
|
||||
if (NS_FAILED(rv)) {
|
||||
PR_fprintf(PR_STDERR, "Error: argument -appomni requires a valid path\n");
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
mozilla::Omnijar::Init(greOmni, appOmni);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
|
|
@ -512,9 +512,7 @@ XRE_InitChildProcess(int aArgc,
|
|||
// Allow ProcessChild to clean up after itself before going out of
|
||||
// scope and being deleted
|
||||
process->CleanUp();
|
||||
#ifdef MOZ_OMNIJAR
|
||||
mozilla::SetOmnijar(nsnull);
|
||||
#endif
|
||||
mozilla::Omnijar::CleanUp();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -69,6 +69,7 @@ CPPSRCS = \
|
|||
nsXPComInit.cpp \
|
||||
nsXPCOMStrings.cpp \
|
||||
Services.cpp \
|
||||
Omnijar.cpp \
|
||||
$(NULL)
|
||||
|
||||
ifndef MOZ_ENABLE_LIBXUL
|
||||
|
@ -77,10 +78,6 @@ CPPSRCS += dlldeps.cpp
|
|||
endif
|
||||
endif
|
||||
|
||||
ifdef MOZ_OMNIJAR
|
||||
CPPSRCS += Omnijar.cpp
|
||||
endif
|
||||
|
||||
SHARED_LIBRARY_LIBS = \
|
||||
$(DEPTH)/chrome/src/$(LIB_PREFIX)chrome_s.$(LIB_SUFFIX) \
|
||||
../ds/$(LIB_PREFIX)xpcomds_s.$(LIB_SUFFIX) \
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
* Michael Wu <mwu@mozilla.com>
|
||||
* Mike Hommey <mh@glandium.org>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -38,64 +39,152 @@
|
|||
|
||||
#include "Omnijar.h"
|
||||
|
||||
#include "nsILocalFile.h"
|
||||
#include "nsXULAppAPI.h"
|
||||
#include "nsDirectoryService.h"
|
||||
#include "nsDirectoryServiceDefs.h"
|
||||
#include "nsIFile.h"
|
||||
#include "nsZipArchive.h"
|
||||
#include "nsNetUtil.h"
|
||||
|
||||
static nsILocalFile* sOmnijarPath = nsnull;
|
||||
static nsZipArchive* sOmnijarReader = nsnull;
|
||||
namespace mozilla {
|
||||
|
||||
static void
|
||||
SetupReader()
|
||||
nsIFile *Omnijar::sPath[2] = { nsnull, nsnull };
|
||||
nsZipArchive *Omnijar::sReader[2] = { nsnull, nsnull };
|
||||
PRPackedBool Omnijar::sInitialized = PR_FALSE;
|
||||
static PRPackedBool sIsUnified = PR_FALSE;
|
||||
|
||||
static const char *sProp[2] =
|
||||
{ NS_GRE_DIR, NS_XPCOM_CURRENT_PROCESS_DIR };
|
||||
|
||||
#define SPROP(Type) ((Type == mozilla::Omnijar::GRE) ? sProp[GRE] : sProp[APP])
|
||||
|
||||
void
|
||||
Omnijar::CleanUpOne(Type aType)
|
||||
{
|
||||
if (!sOmnijarPath) {
|
||||
if (sReader[aType]) {
|
||||
sReader[aType]->CloseArchive();
|
||||
delete sReader[aType];
|
||||
}
|
||||
sReader[aType] = nsnull;
|
||||
NS_IF_RELEASE(sPath[aType]);
|
||||
}
|
||||
|
||||
void
|
||||
Omnijar::InitOne(nsIFile *aPath, Type aType)
|
||||
{
|
||||
nsCOMPtr<nsIFile> file;
|
||||
if (aPath) {
|
||||
file = aPath;
|
||||
} else {
|
||||
nsCOMPtr<nsIFile> dir;
|
||||
nsDirectoryService::gService->Get(SPROP(aType), NS_GET_IID(nsIFile), getter_AddRefs(dir));
|
||||
if (NS_FAILED(dir->Clone(getter_AddRefs(file))) ||
|
||||
NS_FAILED(file->AppendNative(NS_LITERAL_CSTRING("omni.jar"))))
|
||||
return;
|
||||
}
|
||||
PRBool isFile;
|
||||
if (NS_FAILED(file->IsFile(&isFile)) || !isFile) {
|
||||
// If we're not using an omni.jar for GRE, and we don't have an
|
||||
// omni.jar for APP, check if both directories are the same.
|
||||
if ((aType == APP) && (!sPath[GRE])) {
|
||||
nsCOMPtr<nsIFile> greDir, appDir;
|
||||
PRBool equals;
|
||||
nsDirectoryService::gService->Get(SPROP(GRE), NS_GET_IID(nsIFile), getter_AddRefs(greDir));
|
||||
nsDirectoryService::gService->Get(SPROP(APP), NS_GET_IID(nsIFile), getter_AddRefs(appDir));
|
||||
if (NS_SUCCEEDED(greDir->Equals(appDir, &equals)) && equals)
|
||||
sIsUnified = PR_TRUE;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
PRBool equals;
|
||||
if ((aType == APP) && (sPath[GRE]) &&
|
||||
NS_SUCCEEDED(sPath[GRE]->Equals(file, &equals)) && equals) {
|
||||
// If we're using omni.jar on both GRE and APP and their path
|
||||
// is the same, we're in the unified case.
|
||||
sIsUnified = PR_TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
nsZipArchive* zipReader = new nsZipArchive();
|
||||
if (!zipReader) {
|
||||
NS_IF_RELEASE(sOmnijarPath);
|
||||
if (!zipReader)
|
||||
return;
|
||||
}
|
||||
|
||||
if (NS_FAILED(zipReader->OpenArchive(sOmnijarPath))) {
|
||||
if (NS_FAILED(zipReader->OpenArchive(file))) {
|
||||
delete zipReader;
|
||||
NS_IF_RELEASE(sOmnijarPath);
|
||||
return;
|
||||
}
|
||||
|
||||
sOmnijarReader = zipReader;
|
||||
}
|
||||
|
||||
nsILocalFile*
|
||||
mozilla::OmnijarPath()
|
||||
{
|
||||
if (!sOmnijarReader)
|
||||
SetupReader();
|
||||
|
||||
return sOmnijarPath;
|
||||
}
|
||||
|
||||
nsZipArchive*
|
||||
mozilla::OmnijarReader()
|
||||
{
|
||||
if (!sOmnijarReader)
|
||||
SetupReader();
|
||||
|
||||
return sOmnijarReader;
|
||||
CleanUpOne(aType);
|
||||
sReader[aType] = zipReader;
|
||||
sPath[aType] = file;
|
||||
NS_IF_ADDREF(file);
|
||||
}
|
||||
|
||||
void
|
||||
mozilla::SetOmnijar(nsILocalFile* aPath)
|
||||
Omnijar::Init(nsIFile *aGrePath, nsIFile *aAppPath)
|
||||
{
|
||||
NS_IF_RELEASE(sOmnijarPath);
|
||||
if (sOmnijarReader) {
|
||||
sOmnijarReader->CloseArchive();
|
||||
delete sOmnijarReader;
|
||||
sOmnijarReader = nsnull;
|
||||
}
|
||||
|
||||
sOmnijarPath = aPath;
|
||||
NS_IF_ADDREF(sOmnijarPath);
|
||||
InitOne(aGrePath, GRE);
|
||||
InitOne(aAppPath, APP);
|
||||
sInitialized = PR_TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
Omnijar::CleanUp()
|
||||
{
|
||||
CleanUpOne(GRE);
|
||||
CleanUpOne(APP);
|
||||
sInitialized = PR_FALSE;
|
||||
}
|
||||
|
||||
nsZipArchive *
|
||||
Omnijar::GetReader(nsIFile *aPath)
|
||||
{
|
||||
NS_ABORT_IF_FALSE(IsInitialized(), "Omnijar not initialized");
|
||||
|
||||
PRBool equals;
|
||||
nsresult rv;
|
||||
|
||||
if (sPath[GRE]) {
|
||||
rv = sPath[GRE]->Equals(aPath, &equals);
|
||||
if (NS_SUCCEEDED(rv) && equals)
|
||||
return sReader[GRE];
|
||||
}
|
||||
if (sPath[APP]) {
|
||||
rv = sPath[APP]->Equals(aPath, &equals);
|
||||
if (NS_SUCCEEDED(rv) && equals)
|
||||
return sReader[APP];
|
||||
}
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
nsresult
|
||||
Omnijar::GetURIString(Type aType, nsACString &result)
|
||||
{
|
||||
NS_ABORT_IF_FALSE(IsInitialized(), "Omnijar not initialized");
|
||||
|
||||
result.Truncate();
|
||||
|
||||
// Return an empty string for APP in the unified case.
|
||||
if ((aType == APP) && sIsUnified) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsCAutoString omniJarSpec;
|
||||
if (sPath[aType]) {
|
||||
nsresult rv = NS_GetURLSpecFromActualFile(sPath[aType], omniJarSpec);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
result = "jar:";
|
||||
result += omniJarSpec;
|
||||
result += "!";
|
||||
} else {
|
||||
nsCOMPtr<nsIFile> dir;
|
||||
nsDirectoryService::gService->Get(SPROP(aType), NS_GET_IID(nsIFile), getter_AddRefs(dir));
|
||||
nsresult rv = NS_GetURLSpecFromActualFile(dir, result);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
result += "/";
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} /* namespace mozilla */
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
* Michael Wu <mwu@mozilla.com>
|
||||
* Mike Hommey <mh@glandium.org>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -39,24 +40,125 @@
|
|||
#ifndef mozilla_Omnijar_h
|
||||
#define mozilla_Omnijar_h
|
||||
|
||||
class nsILocalFile;
|
||||
class nsZipArchive;
|
||||
#include "nscore.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
class nsIFile;
|
||||
class nsZipArchive;
|
||||
class nsIURI;
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
class Omnijar {
|
||||
private:
|
||||
/**
|
||||
* This returns the path to the omnijar.
|
||||
* If the omnijar isn't available, this function will return null.
|
||||
* Callers should fallback to flat packaging if null.
|
||||
* Store an nsIFile for an omni.jar. We can store two paths here, one
|
||||
* for GRE (corresponding to resource://gre/) and one for APP
|
||||
* (corresponding to resource:/// and resource://app/), but only
|
||||
* store one when both point to the same location (unified).
|
||||
*/
|
||||
nsILocalFile *OmnijarPath();
|
||||
nsZipArchive *OmnijarReader();
|
||||
void SetOmnijar(nsILocalFile* aPath);
|
||||
static nsIFile *sPath[2];
|
||||
|
||||
/**
|
||||
* Cached nsZipArchives for the corresponding sPath
|
||||
*/
|
||||
static nsZipArchive *sReader[2];
|
||||
|
||||
/**
|
||||
* Has Omnijar::Init() been called?
|
||||
*/
|
||||
static PRPackedBool sInitialized;
|
||||
|
||||
public:
|
||||
enum Type {
|
||||
GRE = 0,
|
||||
APP = 1
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns whether SetBase has been called at least once with
|
||||
* a valid nsIFile
|
||||
*/
|
||||
static inline PRPackedBool
|
||||
IsInitialized()
|
||||
{
|
||||
return sInitialized;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the Omnijar API with the given directory or file for GRE and
|
||||
* APP. Each of the paths given can be:
|
||||
* - a file path, pointing to the omnijar file,
|
||||
* - a directory path, pointing to a directory containing an "omni.jar" file,
|
||||
* - nsnull for autodetection of an "omni.jar" file.
|
||||
*/
|
||||
static void Init(nsIFile *aGrePath = nsnull, nsIFile *aAppPath = nsnull);
|
||||
|
||||
/**
|
||||
* Cleans up the Omnijar API
|
||||
*/
|
||||
static void CleanUp();
|
||||
|
||||
/**
|
||||
* Returns an nsIFile pointing to the omni.jar file for GRE or APP.
|
||||
* Returns nsnull when there is no corresponding omni.jar.
|
||||
* Also returns nsnull for APP in the unified case.
|
||||
*/
|
||||
static inline already_AddRefed<nsIFile>
|
||||
GetPath(Type aType)
|
||||
{
|
||||
NS_ABORT_IF_FALSE(IsInitialized(), "Omnijar not initialized");
|
||||
NS_IF_ADDREF(sPath[aType]);
|
||||
return sPath[aType];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether GRE or APP use an omni.jar. Returns PR_False for
|
||||
* APP when using an omni.jar in the unified case.
|
||||
*/
|
||||
static inline PRBool
|
||||
HasOmnijar(Type aType)
|
||||
{
|
||||
NS_ABORT_IF_FALSE(IsInitialized(), "Omnijar not initialized");
|
||||
return !!sPath[aType];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a nsZipArchive pointer for the omni.jar file for GRE or
|
||||
* APP. Returns nsnull in the same cases GetPath() would.
|
||||
*/
|
||||
static inline nsZipArchive *
|
||||
GetReader(Type aType)
|
||||
{
|
||||
NS_ABORT_IF_FALSE(IsInitialized(), "Omnijar not initialized");
|
||||
return sReader[aType];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a nsZipArchive pointer for the given path IAOI the given
|
||||
* path is the omni.jar for either GRE or APP.
|
||||
*/
|
||||
static nsZipArchive *GetReader(nsIFile *aPath);
|
||||
|
||||
/**
|
||||
* Returns the URI string corresponding to the omni.jar or directory
|
||||
* for GRE or APP. i.e. jar:/path/to/omni.jar!/ for omni.jar and
|
||||
* /path/to/base/dir/ otherwise. Returns an empty string for APP in
|
||||
* the unified case.
|
||||
* The returned URI is guaranteed to end with a slash.
|
||||
*/
|
||||
static nsresult GetURIString(Type aType, nsACString &result);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Used internally, respectively by Init() and CleanUp()
|
||||
*/
|
||||
static void InitOne(nsIFile *aPath, Type aType);
|
||||
static void CleanUpOne(Type aType);
|
||||
|
||||
}; /* class Omnijar */
|
||||
|
||||
} /* namespace mozilla */
|
||||
|
||||
#endif /* MOZ_OMNIJAR */
|
||||
|
||||
#endif /* mozilla_Omnijar_h */
|
||||
|
|
|
@ -457,25 +457,11 @@ NS_InitXPCOM2(nsIServiceManager* *result,
|
|||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
NS_TIME_FUNCTION_MARK("Next: Omnijar init");
|
||||
|
||||
if (!mozilla::OmnijarPath()) {
|
||||
nsCOMPtr<nsILocalFile> omnijar;
|
||||
nsCOMPtr<nsIFile> file;
|
||||
|
||||
rv = NS_ERROR_FAILURE;
|
||||
nsDirectoryService::gService->Get(NS_GRE_DIR,
|
||||
NS_GET_IID(nsIFile),
|
||||
getter_AddRefs(file));
|
||||
if (file)
|
||||
rv = file->Append(NS_LITERAL_STRING("omni.jar"));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
omnijar = do_QueryInterface(file);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
mozilla::SetOmnijar(omnijar);
|
||||
if (!mozilla::Omnijar::IsInitialized()) {
|
||||
mozilla::Omnijar::Init();
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((sCommandLineWasInitialized = !CommandLine::IsInitialized())) {
|
||||
NS_TIME_FUNCTION_MARK("Next: IPC command line init");
|
||||
|
@ -755,9 +741,7 @@ ShutdownXPCOM(nsIServiceManager* servMgr)
|
|||
sExitManager = nsnull;
|
||||
}
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
mozilla::SetOmnijar(nsnull);
|
||||
#endif
|
||||
mozilla::Omnijar::CleanUp();
|
||||
|
||||
NS_LogTerm();
|
||||
|
||||
|
|
|
@ -174,8 +174,6 @@ NS_DEFINE_CID(kCategoryManagerCID, NS_CATEGORYMANAGER_CID);
|
|||
#define COMPMGR_TIME_FUNCTION_CONTRACTID(cid) do {} while (0)
|
||||
#endif
|
||||
|
||||
#define kOMNIJAR_PREFIX NS_LITERAL_CSTRING("resource:///")
|
||||
|
||||
nsresult
|
||||
nsGetServiceFromCategory::operator()(const nsIID& aIID, void** aInstancePtr) const
|
||||
{
|
||||
|
@ -385,14 +383,20 @@ nsresult nsComponentManagerImpl::Init()
|
|||
for (PRUint32 i = 0; i < sStaticModules->Length(); ++i)
|
||||
RegisterModule((*sStaticModules)[i], NULL);
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
if (mozilla::OmnijarPath()) {
|
||||
nsCOMPtr<nsIZipReader> omnijarReader = new nsJAR();
|
||||
rv = omnijarReader->Open(mozilla::OmnijarPath());
|
||||
if (NS_SUCCEEDED(rv))
|
||||
RegisterJarManifest(omnijarReader, "chrome.manifest", false);
|
||||
nsCOMPtr<nsIFile> appOmnijar = mozilla::Omnijar::GetPath(mozilla::Omnijar::APP);
|
||||
if (appOmnijar) {
|
||||
cl = sModuleLocations->InsertElementAt(1); // Insert after greDir
|
||||
cl->type = NS_COMPONENT_LOCATION;
|
||||
cl->location = do_QueryInterface(appOmnijar);
|
||||
cl->jar = true;
|
||||
}
|
||||
nsCOMPtr<nsIFile> greOmnijar = mozilla::Omnijar::GetPath(mozilla::Omnijar::GRE);
|
||||
if (greOmnijar) {
|
||||
cl = sModuleLocations->InsertElementAt(0);
|
||||
cl->type = NS_COMPONENT_LOCATION;
|
||||
cl->location = do_QueryInterface(greOmnijar);
|
||||
cl->jar = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
for (PRUint32 i = 0; i < sModuleLocations->Length(); ++i) {
|
||||
ComponentLocation& l = sModuleLocations->ElementAt(i);
|
||||
|
@ -407,15 +411,6 @@ nsresult nsComponentManagerImpl::Init()
|
|||
RegisterJarManifest(reader, "chrome.manifest", false);
|
||||
}
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
if (mozilla::OmnijarPath()) {
|
||||
cl = sModuleLocations->InsertElementAt(0);
|
||||
cl->type = NS_COMPONENT_LOCATION;
|
||||
cl->location = mozilla::OmnijarPath();
|
||||
cl->jar = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
nsCategoryManager::GetSingleton()->SuppressNotifications(false);
|
||||
|
||||
mStatus = NORMAL;
|
||||
|
|
Загрузка…
Ссылка в новой задаче