mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Back out parts 3-7 of bug 620931 which caused bug 656172, r=killer
This commit is contained in:
parent
24950ac5ab
commit
4746e4ca82
@ -123,7 +123,7 @@ _ABS_RUN_TEST_PROGRAM = $(call core_abspath,$(RUN_TEST_PROGRAM))
|
||||
endif
|
||||
|
||||
GENERATE_CACHE = \
|
||||
$(_ABS_RUN_TEST_PROGRAM) $(_ABS_DIST)/bin/xpcshell$(BIN_SUFFIX) -g "$$PWD" -a "$$PWD" -f $(topsrcdir)/browser/installer/precompile_cache.js -e 'populate_startupcache("omni.jar", "startupCache.zip");' && \
|
||||
$(_ABS_RUN_TEST_PROGRAM) $(_ABS_DIST)/bin/xpcshell$(BIN_SUFFIX) -g "$$PWD" -f $(topsrcdir)/browser/installer/precompile_cache.js -e 'populate_startupcache("omni.jar", "startupCache.zip");' && \
|
||||
rm -rf jsloader && \
|
||||
$(UNZIP) startupCache.zip && \
|
||||
rm startupCache.zip && \
|
||||
|
@ -65,10 +65,23 @@ function load(url) {
|
||||
function load_entries(entries, prefix) {
|
||||
while (entries.hasMore()) {
|
||||
var c = entries.getNext();
|
||||
// Required to ensure sync js is only loaded in load_custom_entries.
|
||||
// That function loads the sync js with the right URIs.
|
||||
if (c.indexOf("services-sync") >= 0)
|
||||
continue;
|
||||
if (c.indexOf("services-crypto") >= 0)
|
||||
continue;
|
||||
load(prefix + c);
|
||||
}
|
||||
}
|
||||
|
||||
function load_custom_entries(entries, subst) {
|
||||
while (entries.hasMore()) {
|
||||
var c = entries.getNext();
|
||||
load("resource://" + subst + "/" + c.replace("modules/" + subst + "/", ""));
|
||||
}
|
||||
}
|
||||
|
||||
function getGreDir() {
|
||||
return Cc["@mozilla.org/file/directory_service;1"].
|
||||
getService(Ci.nsIProperties).get("GreD", Ci.nsIFile);
|
||||
@ -90,10 +103,27 @@ function populate_startupcache(omnijarName, startupcacheName) {
|
||||
scFile.append(startupcacheName);
|
||||
setenv("MOZ_STARTUP_CACHE", scFile.path);
|
||||
|
||||
let prefix = "resource:///";
|
||||
// the sync part below doesn't work as smoothly
|
||||
let ioService = Cc["@mozilla.org/network/io-service;1"].
|
||||
getService(Ci.nsIIOService);
|
||||
let uri = ioService.newURI("resource:///modules/services-sync/",
|
||||
null, null);
|
||||
let resProt = ioService.getProtocolHandler("resource")
|
||||
.QueryInterface(Ci.nsIResProtocolHandler);
|
||||
resProt.setSubstitution("services-sync", uri);
|
||||
|
||||
load_entries(zipreader.findEntries("components/*js"), prefix);
|
||||
load_entries(zipreader.findEntries("modules/*js"), prefix);
|
||||
load_entries(zipreader.findEntries("modules/*jsm"), prefix);
|
||||
uri = ioService.newURI("resource:///modules/services-crypto/",
|
||||
null, null);
|
||||
resProt.setSubstitution("services-crypto", uri);
|
||||
|
||||
load_entries(zipreader.findEntries("components/*js"), "resource://gre/");
|
||||
|
||||
load_custom_entries(zipreader.findEntries("modules/services-sync/*js"),
|
||||
"services-sync");
|
||||
load_custom_entries(zipreader.findEntries("modules/services-crypto/*js"),
|
||||
"services-crypto");
|
||||
|
||||
load_entries(zipreader.findEntries("modules/*js"), "resource://gre/");
|
||||
load_entries(zipreader.findEntries("modules/*jsm"), "resource://gre/");
|
||||
zipreader.close();
|
||||
}
|
||||
|
@ -377,7 +377,7 @@ public class GeckoAppShell
|
||||
GeckoAppShell.setSurfaceView(GeckoApp.surfaceView);
|
||||
|
||||
// First argument is the .apk path
|
||||
String combinedArgs = apkPath + " -greomni " + apkPath;
|
||||
String combinedArgs = apkPath + " -omnijar " + apkPath;
|
||||
if (args != null)
|
||||
combinedArgs += " " + args;
|
||||
if (url != null)
|
||||
|
@ -492,19 +492,16 @@ 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 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());
|
||||
nsCAutoString omnijarPath;
|
||||
if (mozilla::OmnijarPath()) {
|
||||
mozilla::OmnijarPath()->GetNativePath(omnijarPath);
|
||||
childArgv.push_back("-omnijar");
|
||||
childArgv.push_back(omnijarPath.get());
|
||||
}
|
||||
#endif
|
||||
|
||||
childArgv.push_back(pidstring);
|
||||
|
||||
@ -607,19 +604,16 @@ 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 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());
|
||||
nsAutoString omnijarPath;
|
||||
if (mozilla::OmnijarPath()) {
|
||||
mozilla::OmnijarPath()->GetPath(omnijarPath);
|
||||
cmdLine.AppendLooseValue(UTF8ToWide("-omnijar"));
|
||||
cmdLine.AppendLooseValue(omnijarPath.get());
|
||||
}
|
||||
#endif
|
||||
|
||||
cmdLine.AppendLooseValue(UTF8ToWide(pidstring));
|
||||
|
||||
|
@ -84,7 +84,6 @@
|
||||
#include "nsILocalFileWin.h"
|
||||
#endif
|
||||
#include "xpcprivate.h"
|
||||
#include "nsIResProtocolHandler.h"
|
||||
|
||||
#ifdef MOZ_ENABLE_LIBXUL
|
||||
#include "mozilla/scache/StartupCache.h"
|
||||
@ -622,11 +621,24 @@ mozJSComponentLoader::LoadModuleFromJAR(nsILocalFile *aJarFile,
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCAutoString fullSpec, fileSpec;
|
||||
NS_GetURLSpecFromActualFile(aJarFile, fileSpec);
|
||||
fullSpec = "jar:";
|
||||
fullSpec += fileSpec;
|
||||
fullSpec += "!/";
|
||||
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
|
||||
|
||||
fullSpec += aComponentPath;
|
||||
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
@ -807,128 +819,47 @@ 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/ prefix is used to group mozJSComponentLoader cache entries in
|
||||
* * jsloader/<scheme> prefix is used to group mozJSComponentLoader cache entries in
|
||||
* a top-level zip directory.
|
||||
* * 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
|
||||
* * In MOZ_OMNIJAR case resource:/// and resource://gre/ URIs refer to the same path
|
||||
* so treat both of them as resource://gre/
|
||||
* * .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 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
|
||||
* resource://gre/modules/XPCOMUtils.jsm becomes
|
||||
* jsloader/resource/gre/modules/XPCOMUtils.jsm.bin
|
||||
*/
|
||||
static nsresult
|
||||
PathifyURI(nsIURI *in, nsACString &out)
|
||||
{
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
/* static */
|
||||
|
@ -1150,7 +1150,7 @@ static int
|
||||
usage(void)
|
||||
{
|
||||
fprintf(gErrFile, "%s\n", JS_GetImplementationVersion());
|
||||
fprintf(gErrFile, "usage: xpcshell [-g gredir] [-a appdir] [-r manifest]... [-PsSwWxCij] [-v version] [-f scriptfile] [-e script] [scriptfile] [scriptarg...]\n");
|
||||
fprintf(gErrFile, "usage: xpcshell [-g gredir] [-r manifest]... [-PsSwWxCij] [-v version] [-f scriptfile] [-e script] [scriptfile] [scriptarg...]\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
@ -1804,23 +1804,6 @@ main(int argc, char **argv, char **envp)
|
||||
argv += 2;
|
||||
}
|
||||
|
||||
if (argc > 1 && !strcmp(argv[1], "-a")) {
|
||||
if (argc < 3)
|
||||
return usage();
|
||||
|
||||
nsCOMPtr<nsILocalFile> dir;
|
||||
rv = XRE_GetFileFromPath(argv[2], getter_AddRefs(dir));
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
appDir = do_QueryInterface(dir, &rv);
|
||||
}
|
||||
if (NS_FAILED(rv)) {
|
||||
printf("Couldn't use given appdir.\n");
|
||||
return 1;
|
||||
}
|
||||
argc -= 2;
|
||||
argv += 2;
|
||||
}
|
||||
|
||||
while (argc > 1 && !strcmp(argv[1], "-r")) {
|
||||
if (argc < 3)
|
||||
return usage();
|
||||
|
@ -177,13 +177,16 @@ 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
|
||||
nsZipArchive *zip = mozilla::Omnijar::GetReader(zipFile);
|
||||
if (zip) {
|
||||
mZip = zip;
|
||||
PRBool equals;
|
||||
nsresult rv = zipFile->Equals(mozilla::OmnijarPath(), &equals);
|
||||
if (NS_SUCCEEDED(rv) && equals) {
|
||||
mZip = mozilla::OmnijarReader();
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
return mZip->OpenArchive(zipFile);
|
||||
}
|
||||
|
||||
@ -232,12 +235,13 @@ nsJAR::Close()
|
||||
mGlobalStatus = JAR_MANIFEST_NOT_PARSED;
|
||||
mTotalItemsInManifest = 0;
|
||||
|
||||
if ((mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE)) ||
|
||||
(mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::APP))) {
|
||||
#ifdef MOZ_OMNIJAR
|
||||
if (mZip == mozilla::OmnijarReader()) {
|
||||
mZip.forget();
|
||||
mZip = new nsZipArchive();
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
return mZip->CloseArchive();
|
||||
}
|
||||
|
||||
@ -388,11 +392,12 @@ 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::Omnijar::GetReader(mozilla::Omnijar::GRE)) ||
|
||||
(mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::APP)))
|
||||
if (mZip == mozilla::OmnijarReader())
|
||||
return NS_OK;
|
||||
#endif
|
||||
|
||||
//-- Parse the manifest
|
||||
nsresult rv = ParseManifest();
|
||||
|
@ -70,8 +70,10 @@
|
||||
|
||||
#include "nsITimelineService.h"
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
#include "mozilla/Omnijar.h"
|
||||
#include "nsZipArchive.h"
|
||||
#endif
|
||||
|
||||
// Definitions
|
||||
#define INITIAL_PREF_FILES 10
|
||||
@ -782,6 +784,30 @@ 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);
|
||||
@ -795,121 +821,77 @@ static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name)
|
||||
return rv;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------
|
||||
// Initialize default preference JavaScript buffers from
|
||||
// appropriate TEXT resources
|
||||
//----------------------------------------------------------------------------------------
|
||||
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
|
||||
|
||||
static nsresult pref_InitInitialObjects()
|
||||
{
|
||||
nsresult 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
|
||||
// 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);
|
||||
|
||||
nsZipFind *findPtr;
|
||||
nsAutoPtr<nsZipFind> find;
|
||||
nsTArray<nsCString> prefEntries;
|
||||
const char *entryName;
|
||||
PRUint16 entryNameLen;
|
||||
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);
|
||||
|
||||
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[] = {
|
||||
/* 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(VMS)
|
||||
, "openvms.js"
|
||||
#elif defined(_AIX)
|
||||
#if 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.");
|
||||
}
|
||||
|
||||
// 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_LoadPrefsInDir(defaultPrefDir, specialFiles, NS_ARRAY_LENGTH(specialFiles));
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_WARNING("Error parsing application default preferences.");
|
||||
}
|
||||
|
||||
rv = pref_LoadPrefsInDirList(NS_APP_PREFS_DEFAULTS_DIR_LIST);
|
||||
|
@ -76,7 +76,6 @@ static nsResProtocolHandler *gResHandler = nsnull;
|
||||
static PRLogModuleInfo *gResLog;
|
||||
#endif
|
||||
|
||||
#define kAPP NS_LITERAL_CSTRING("app")
|
||||
#define kGRE NS_LITERAL_CSTRING("gre")
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -154,6 +153,20 @@ 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()
|
||||
{
|
||||
@ -165,37 +178,24 @@ nsResProtocolHandler::Init()
|
||||
mIOService = do_GetIOService(&rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
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);
|
||||
#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
|
||||
|
||||
//
|
||||
// make resource:/// point to the application directory or omnijar
|
||||
// make resource:/// point to the application directory
|
||||
//
|
||||
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://app/ point to the application directory or omnijar
|
||||
//
|
||||
rv = SetSubstitution(kAPP, uri);
|
||||
rv = AddSpecialDir(NS_OS_CURRENT_PROCESS_DIR, EmptyCString());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
//
|
||||
// make resource://gre/ point to the GRE directory
|
||||
//
|
||||
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);
|
||||
rv = AddSpecialDir(NS_GRE_DIR, kGRE);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
//XXXbsmedberg Neil wants a resource://pchrome/ for the profile chrome dir...
|
||||
@ -207,6 +207,34 @@ 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], "-greomni"))
|
||||
if (strcmp(argv[i], "-omnijar"))
|
||||
continue;
|
||||
|
||||
i = i + 1;
|
||||
|
@ -250,26 +250,17 @@ StartupCache::GetBuffer(const char* id, char** outbuf, PRUint32* length)
|
||||
}
|
||||
}
|
||||
|
||||
if (mozilla::Omnijar::GetReader(mozilla::Omnijar::APP)) {
|
||||
#ifdef MOZ_OMNIJAR
|
||||
if (mozilla::OmnijarReader()) {
|
||||
// no need to checksum omnijarred entries
|
||||
nsZipItemPtr<char> zipItem(mozilla::Omnijar::GetReader(mozilla::Omnijar::APP), id);
|
||||
nsZipItemPtr<char> zipItem(mozilla::OmnijarReader(), id);
|
||||
if (zipItem) {
|
||||
*outbuf = zipItem.Forget();
|
||||
*length = zipItem.Length();
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
|
@ -3826,39 +3826,24 @@ XRE_InitCommandLine(int aArgc, char* aArgv[])
|
||||
delete[] canonArgs;
|
||||
#endif
|
||||
|
||||
const char *path = nsnull;
|
||||
ArgResult ar = CheckArg("greomni", PR_FALSE, &path);
|
||||
#ifdef MOZ_OMNIJAR
|
||||
const char *omnijarPath = nsnull;
|
||||
ArgResult ar = CheckArg("omnijar", PR_FALSE, &omnijarPath);
|
||||
if (ar == ARG_BAD) {
|
||||
PR_fprintf(PR_STDERR, "Error: argument -greomni requires a path argument\n");
|
||||
PR_fprintf(PR_STDERR, "Error: argument -omnijar requires an omnijar path\n");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
if (!path)
|
||||
if (!omnijarPath)
|
||||
return rv;
|
||||
|
||||
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;
|
||||
}
|
||||
nsCOMPtr<nsILocalFile> omnijar;
|
||||
rv = NS_NewNativeLocalFile(nsDependentCString(omnijarPath), PR_TRUE,
|
||||
getter_AddRefs(omnijar));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
mozilla::SetOmnijar(omnijar);
|
||||
#endif
|
||||
|
||||
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,7 +512,9 @@ XRE_InitChildProcess(int aArgc,
|
||||
// Allow ProcessChild to clean up after itself before going out of
|
||||
// scope and being deleted
|
||||
process->CleanUp();
|
||||
mozilla::Omnijar::CleanUp();
|
||||
#ifdef MOZ_OMNIJAR
|
||||
mozilla::SetOmnijar(nsnull);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -301,6 +301,9 @@ nsXREDirProvider::GetFile(const char* aProperty, PRBool* aPersistent,
|
||||
if (NS_SUCCEEDED(rv))
|
||||
file = lf;
|
||||
}
|
||||
else if (!strcmp(aProperty, "resource:app")) {
|
||||
rv = GetAppDir()->Clone(getter_AddRefs(file));
|
||||
}
|
||||
|
||||
else if (!strcmp(aProperty, NS_APP_PROFILE_DIR_STARTUP) && mProfileDir) {
|
||||
return mProfileDir->Clone(aFile);
|
||||
|
@ -69,7 +69,6 @@ CPPSRCS = \
|
||||
nsXPComInit.cpp \
|
||||
nsXPCOMStrings.cpp \
|
||||
Services.cpp \
|
||||
Omnijar.cpp \
|
||||
$(NULL)
|
||||
|
||||
ifndef MOZ_ENABLE_LIBXUL
|
||||
@ -78,6 +77,10 @@ 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,7 +21,6 @@
|
||||
*
|
||||
* 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,152 +38,64 @@
|
||||
|
||||
#include "Omnijar.h"
|
||||
|
||||
#include "nsDirectoryService.h"
|
||||
#include "nsDirectoryServiceDefs.h"
|
||||
#include "nsIFile.h"
|
||||
#include "nsILocalFile.h"
|
||||
#include "nsXULAppAPI.h"
|
||||
#include "nsZipArchive.h"
|
||||
#include "nsNetUtil.h"
|
||||
|
||||
namespace mozilla {
|
||||
static nsILocalFile* sOmnijarPath = nsnull;
|
||||
static nsZipArchive* sOmnijarReader = nsnull;
|
||||
|
||||
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)
|
||||
static void
|
||||
SetupReader()
|
||||
{
|
||||
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;
|
||||
if (!sOmnijarPath) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsZipArchive* zipReader = new nsZipArchive();
|
||||
if (!zipReader)
|
||||
if (!zipReader) {
|
||||
NS_IF_RELEASE(sOmnijarPath);
|
||||
return;
|
||||
}
|
||||
|
||||
if (NS_FAILED(zipReader->OpenArchive(file))) {
|
||||
if (NS_FAILED(zipReader->OpenArchive(sOmnijarPath))) {
|
||||
delete zipReader;
|
||||
NS_IF_RELEASE(sOmnijarPath);
|
||||
return;
|
||||
}
|
||||
|
||||
CleanUpOne(aType);
|
||||
sReader[aType] = zipReader;
|
||||
sPath[aType] = file;
|
||||
NS_IF_ADDREF(file);
|
||||
sOmnijarReader = zipReader;
|
||||
}
|
||||
|
||||
nsILocalFile*
|
||||
mozilla::OmnijarPath()
|
||||
{
|
||||
if (!sOmnijarReader)
|
||||
SetupReader();
|
||||
|
||||
return sOmnijarPath;
|
||||
}
|
||||
|
||||
nsZipArchive*
|
||||
mozilla::OmnijarReader()
|
||||
{
|
||||
if (!sOmnijarReader)
|
||||
SetupReader();
|
||||
|
||||
return sOmnijarReader;
|
||||
}
|
||||
|
||||
void
|
||||
Omnijar::Init(nsIFile *aGrePath, nsIFile *aAppPath)
|
||||
mozilla::SetOmnijar(nsILocalFile* aPath)
|
||||
{
|
||||
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;
|
||||
NS_IF_RELEASE(sOmnijarPath);
|
||||
if (sOmnijarReader) {
|
||||
sOmnijarReader->CloseArchive();
|
||||
delete sOmnijarReader;
|
||||
sOmnijarReader = nsnull;
|
||||
}
|
||||
|
||||
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;
|
||||
sOmnijarPath = aPath;
|
||||
NS_IF_ADDREF(sOmnijarPath);
|
||||
}
|
||||
|
||||
} /* namespace mozilla */
|
||||
|
@ -21,7 +21,6 @@
|
||||
*
|
||||
* 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
|
||||
@ -40,125 +39,24 @@
|
||||
#ifndef mozilla_Omnijar_h
|
||||
#define mozilla_Omnijar_h
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsString.h"
|
||||
|
||||
class nsIFile;
|
||||
class nsILocalFile;
|
||||
class nsZipArchive;
|
||||
class nsIURI;
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
class Omnijar {
|
||||
private:
|
||||
/**
|
||||
* 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).
|
||||
* 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.
|
||||
*/
|
||||
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 */
|
||||
nsILocalFile *OmnijarPath();
|
||||
nsZipArchive *OmnijarReader();
|
||||
void SetOmnijar(nsILocalFile* aPath);
|
||||
|
||||
} /* namespace mozilla */
|
||||
|
||||
#endif /* MOZ_OMNIJAR */
|
||||
|
||||
#endif /* mozilla_Omnijar_h */
|
||||
|
@ -457,11 +457,25 @@ NS_InitXPCOM2(nsIServiceManager* *result,
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
|
||||
#ifdef MOZ_OMNIJAR
|
||||
NS_TIME_FUNCTION_MARK("Next: Omnijar init");
|
||||
|
||||
if (!mozilla::Omnijar::IsInitialized()) {
|
||||
mozilla::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);
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((sCommandLineWasInitialized = !CommandLine::IsInitialized())) {
|
||||
NS_TIME_FUNCTION_MARK("Next: IPC command line init");
|
||||
@ -741,7 +755,9 @@ ShutdownXPCOM(nsIServiceManager* servMgr)
|
||||
sExitManager = nsnull;
|
||||
}
|
||||
|
||||
mozilla::Omnijar::CleanUp();
|
||||
#ifdef MOZ_OMNIJAR
|
||||
mozilla::SetOmnijar(nsnull);
|
||||
#endif
|
||||
|
||||
NS_LogTerm();
|
||||
|
||||
|
@ -174,6 +174,8 @@ 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
|
||||
{
|
||||
@ -383,20 +385,14 @@ nsresult nsComponentManagerImpl::Init()
|
||||
for (PRUint32 i = 0; i < sStaticModules->Length(); ++i)
|
||||
RegisterModule((*sStaticModules)[i], NULL);
|
||||
|
||||
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;
|
||||
#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);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (PRUint32 i = 0; i < sModuleLocations->Length(); ++i) {
|
||||
ComponentLocation& l = sModuleLocations->ElementAt(i);
|
||||
@ -411,6 +407,15 @@ 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;
|
||||
|
@ -41,7 +41,6 @@ MOZ_APP_DISPLAYNAME=XULRunner
|
||||
MOZ_UPDATER=1
|
||||
MOZ_XULRUNNER=1
|
||||
MOZ_ENABLE_LIBXUL=1
|
||||
MOZ_CHROME_FILE_FORMAT=omni
|
||||
MOZ_STATIC_BUILD_UNSUPPORTED=1
|
||||
MOZ_APP_VERSION=$MOZILLA_VERSION
|
||||
if test "$MOZ_STORAGE"; then
|
||||
|
Loading…
Reference in New Issue
Block a user