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:
Jim Chen 2016-04-28 16:07:02 -04:00
Родитель a32009c9cc
Коммит 93b208fc7e
2 изменённых файлов: 43 добавлений и 10 удалений

Просмотреть файл

@ -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