зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1265621 - Expose outer zip readers in Omnijar::GetReader; r=froydnj
Previously, Omnijar::GetReader(nsIFile*) returned nullptr when using nested jars. This patch makes it return the outer jar reader in that case, so we don't end up opening the outer jar file again.
This commit is contained in:
Родитель
a32009c9cc
Коммит
93b208fc7e
|
@ -16,9 +16,9 @@ namespace mozilla {
|
|||
|
||||
StaticRefPtr<nsIFile> Omnijar::sPath[2];
|
||||
StaticRefPtr<nsZipArchive> Omnijar::sReader[2];
|
||||
StaticRefPtr<nsZipArchive> Omnijar::sOuterReader[2];
|
||||
bool Omnijar::sInitialized = false;
|
||||
bool Omnijar::sIsUnified = false;
|
||||
bool Omnijar::sIsNested[2] = { false, false };
|
||||
|
||||
static const char* sProp[2] = {
|
||||
NS_GRE_DIR, NS_XPCOM_CURRENT_PROCESS_DIR
|
||||
|
@ -33,6 +33,10 @@ Omnijar::CleanUpOne(Type aType)
|
|||
sReader[aType]->CloseArchive();
|
||||
sReader[aType] = nullptr;
|
||||
}
|
||||
if (sOuterReader[aType]) {
|
||||
sOuterReader[aType]->CloseArchive();
|
||||
sOuterReader[aType] = nullptr;
|
||||
}
|
||||
sPath[aType] = nullptr;
|
||||
}
|
||||
|
||||
|
@ -84,18 +88,20 @@ Omnijar::InitOne(nsIFile* aPath, Type aType)
|
|||
return;
|
||||
}
|
||||
|
||||
RefPtr<nsZipArchive> outerReader;
|
||||
RefPtr<nsZipHandle> handle;
|
||||
if (NS_SUCCEEDED(nsZipHandle::Init(zipReader, NS_STRINGIFY(OMNIJAR_NAME),
|
||||
getter_AddRefs(handle)))) {
|
||||
outerReader = zipReader;
|
||||
zipReader = new nsZipArchive();
|
||||
if (NS_FAILED(zipReader->OpenArchive(handle))) {
|
||||
return;
|
||||
}
|
||||
sIsNested[aType] = true;
|
||||
}
|
||||
|
||||
CleanUpOne(aType);
|
||||
sReader[aType] = zipReader;
|
||||
sOuterReader[aType] = outerReader;
|
||||
sPath[aType] = file;
|
||||
}
|
||||
|
||||
|
@ -123,16 +129,16 @@ Omnijar::GetReader(nsIFile* aPath)
|
|||
bool equals;
|
||||
nsresult rv;
|
||||
|
||||
if (sPath[GRE] && !sIsNested[GRE]) {
|
||||
if (sPath[GRE]) {
|
||||
rv = sPath[GRE]->Equals(aPath, &equals);
|
||||
if (NS_SUCCEEDED(rv) && equals) {
|
||||
return GetReader(GRE);
|
||||
return IsNested(GRE) ? GetOuterReader(GRE) : GetReader(GRE);
|
||||
}
|
||||
}
|
||||
if (sPath[APP] && !sIsNested[APP]) {
|
||||
if (sPath[APP]) {
|
||||
rv = sPath[APP]->Equals(aPath, &equals);
|
||||
if (NS_SUCCEEDED(rv) && equals) {
|
||||
return GetReader(APP);
|
||||
return IsNested(APP) ? GetOuterReader(APP) : GetReader(APP);
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
|
@ -158,12 +164,12 @@ Omnijar::GetURIString(Type aType, nsACString& aResult)
|
|||
}
|
||||
|
||||
aResult = "jar:";
|
||||
if (sIsNested[aType]) {
|
||||
if (IsNested(aType)) {
|
||||
aResult += "jar:";
|
||||
}
|
||||
aResult += omniJarSpec;
|
||||
aResult += "!";
|
||||
if (sIsNested[aType]) {
|
||||
if (IsNested(aType)) {
|
||||
aResult += "/" NS_STRINGIFY(OMNIJAR_NAME) "!";
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -33,6 +33,12 @@ private:
|
|||
*/
|
||||
static StaticRefPtr<nsZipArchive> sReader[2];
|
||||
|
||||
/**
|
||||
* Cached nsZipArchives for the outer jar, when using nested jars.
|
||||
* Otherwise nullptr.
|
||||
*/
|
||||
static StaticRefPtr<nsZipArchive> sOuterReader[2];
|
||||
|
||||
/**
|
||||
* Has Omnijar::Init() been called?
|
||||
*/
|
||||
|
@ -43,8 +49,6 @@ private:
|
|||
*/
|
||||
static bool sIsUnified;
|
||||
|
||||
static bool sIsNested[2];
|
||||
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
|
@ -52,6 +56,29 @@ public:
|
|||
APP = 1
|
||||
};
|
||||
|
||||
private:
|
||||
/**
|
||||
* Returns whether we are using nested jars.
|
||||
*/
|
||||
static inline bool IsNested(Type aType)
|
||||
{
|
||||
MOZ_ASSERT(IsInitialized(), "Omnijar not initialized");
|
||||
return !!sOuterReader[aType];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a nsZipArchive pointer for the outer jar file when using nested
|
||||
* jars. Returns nullptr in the same cases GetPath() would, or if not using
|
||||
* nested jars.
|
||||
*/
|
||||
static inline already_AddRefed<nsZipArchive> GetOuterReader(Type aType)
|
||||
{
|
||||
MOZ_ASSERT(IsInitialized(), "Omnijar not initialized");
|
||||
RefPtr<nsZipArchive> reader = sOuterReader[aType].get();
|
||||
return reader.forget();
|
||||
}
|
||||
|
||||
public:
|
||||
/**
|
||||
* Returns whether SetBase has been called at least once with
|
||||
* a valid nsIFile
|
||||
|
|
Загрузка…
Ссылка в новой задаче