fix bug 160000 - custom.jar support for chrome

look for custom.jar in the chrome directory - if found, always check it first for files before using the rest of the chrome registry. This allows embeddors to override specific chrome URLs with their own files.
sr=hyatt, r=chak
This commit is contained in:
alecf%netscape.com 2002-08-21 20:58:05 +00:00
Родитель 98438361a1
Коммит 4e0b59f695
8 изменённых файлов: 300 добавлений и 48 удалений

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

@ -105,8 +105,8 @@ interface nsIXULChromeRegistry : nsIChromeRegistry {
/* runtimeProvider == true: don't assert the runtime change */
void setRuntimeProvider(in boolean runtimeProvider);
boolean checkThemeVersion(in wstring skinName);
boolean checkLocaleVersion(in wstring localeName);
boolean checkThemeVersion(in ACString skinName);
boolean checkLocaleVersion(in ACString localeName);
/* Apply skin/locale to a specific package */
void selectSkinForPackage(in ACString skinName,

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

@ -539,6 +539,11 @@ nsChromeRegistry::ConvertChromeURL(nsIURI* aChromeURL, nsACString& aResult)
}
nsCAutoString finalURL;
rv = GetOverrideURL(package, provider, remaining, finalURL);
if (NS_SUCCEEDED(rv))
return NS_OK;
rv = GetBaseURL(package, provider, finalURL);
#ifdef DEBUG
if (NS_FAILED(rv)) {
@ -658,10 +663,122 @@ nsChromeRegistry::GetBaseURL(const nsACString& aPackage,
}
// From this resource, follow the "baseURL" arc.
return nsChromeRegistry::FollowArc(mChromeDataSource,
aBaseURL,
resource,
mBaseURL);
return FollowArc(mChromeDataSource, aBaseURL, resource, mBaseURL);
}
nsresult
nsChromeRegistry::GetOverrideURL(const nsACString& aPackage,
const nsACString& aProvider,
const nsACString& aPath,
nsACString& aResult)
{
nsresult rv = InitOverrideJAR();
if (NS_FAILED(rv)) return rv;
// ok, if we get here, we have an override JAR
aResult.SetCapacity(mOverrideJARURL.Length() +
aPackage.Length() +
aProvider.Length() +
aPath.Length() + 2);
aResult = mOverrideJARURL;
aResult += aPackage;
aResult += '/';
aResult += aProvider;
aResult += '/';
// skins and locales get their name tacked on, like
// skin/modern/foo.css or
// locale/en-US/navigator.properties
if (aProvider.Equals(NS_LITERAL_CSTRING("skin")) ||
aProvider.Equals(NS_LITERAL_CSTRING("locale"))) {
// little hack here to get the right arc
nsIRDFResource* providerArc;
if (aProvider.Equals("skin"))
providerArc = mSelectedSkin;
else
providerArc = mSelectedLocale;
nsCAutoString selectedProvider;
rv = GetSelectedProvider(aPackage, aProvider, providerArc, selectedProvider);
if (NS_SUCCEEDED(rv)) {
aResult += selectedProvider;
aResult += '/';
}
}
aResult += aPath;
nsCOMPtr<nsIZipEntry> zipEntry;
rv = mOverrideJAR->GetEntry(PromiseFlatCString(aResult).get(),
getter_AddRefs(zipEntry));
if (NS_FAILED(rv)) {
aResult.Truncate();
return rv;
}
return NS_OK;
}
nsresult
nsChromeRegistry::InitOverrideJAR()
{
// generic failure if we know there's no override
if (mSearchedForOverride && !mOverrideJAR)
return NS_ERROR_FAILURE;
mSearchedForOverride = PR_TRUE;
nsresult rv;
//
// look for custom.jar
//
nsCOMPtr<nsIFile> overrideFile;
rv = GetInstallRoot(getter_AddRefs(overrideFile));
if (NS_FAILED(rv)) return rv;
rv = overrideFile->AppendNative(NS_LITERAL_CSTRING("custom.jar"));
if (NS_FAILED(rv)) return rv;
PRBool exists;
rv = overrideFile->Exists(&exists);
if (NS_FAILED(rv)) return rv;
// ok, if the file doesn't exist, its just a generic failure
if (!exists)
return NS_ERROR_FAILURE;
//
// cache the url so we can later append
//
mOverrideJARURL.Assign("jar:");
nsCAutoString jarURL;
rv = NS_GetURLSpecFromFile(overrideFile, jarURL);
if (NS_FAILED(rv)) return rv;
mOverrideJARURL.Append(jarURL);
mOverrideJARURL.Append("!/");
if (NS_FAILED(rv)) return rv;
//
// also cache the zip file itself
//
nsCOMPtr<nsIZipReaderCache> readerCache =
do_CreateInstance("@mozilla.org/libjar/zip-reader-cache;1", &rv);
if (NS_FAILED(rv)) return rv;
rv = readerCache->Init(32);
rv = readerCache->GetZip(overrideFile, getter_AddRefs(mOverrideJAR));
if (NS_FAILED(rv)) {
mOverrideJARURL.Truncate();
return rv;
}
return NS_OK;
}
// locate
@ -746,7 +863,7 @@ nsresult
nsChromeRegistry::SelectPackageInProvider(nsIRDFResource *aPackageList,
const nsACString& aPackage,
const nsACString& aProvider,
const nsCString& aProviderName,
const nsACString& aProviderName,
nsIRDFResource *aArc,
nsIRDFNode **aSelectedProvider)
{
@ -2217,10 +2334,9 @@ nsChromeRegistry::InstallProvider(const nsACString& aProviderType,
if (NS_FAILED(rv)) return rv;
// Get the literal for our script access.
nsAutoString scriptstr;
scriptstr.Assign(NS_LITERAL_STRING("false"));
nsCOMPtr<nsIRDFLiteral> scriptLiteral;
rv = mRDFService->GetLiteral(scriptstr.get(), getter_AddRefs(scriptLiteral));
rv = mRDFService->GetLiteral(NS_LITERAL_STRING("false").get(),
getter_AddRefs(scriptLiteral));
if (NS_FAILED(rv)) return rv;
// Build the prefix string. Only resources with this prefix string will have their
@ -2639,8 +2755,8 @@ nsChromeRegistry::GetProfileRoot(nsACString& aFileURL)
// copy along
// It aint an error if these files dont exist
(void) defaultUserContentFile->CopyToNative(userChromeDir, nsCString());
(void) defaultUserChromeFile->CopyToNative(userChromeDir, nsCString());
(void) defaultUserContentFile->CopyToNative(userChromeDir, NS_LITERAL_CSTRING(""));
(void) defaultUserChromeFile->CopyToNative(userChromeDir, NS_LITERAL_CSTRING(""));
}
}
if (NS_FAILED(rv))
@ -2713,7 +2829,7 @@ nsChromeRegistry::ReloadChrome()
nsresult
nsChromeRegistry::GetArcs(nsIRDFDataSource* aDataSource,
const nsCString& aType,
const nsACString& aType,
nsISimpleEnumerator** aResult)
{
nsCOMPtr<nsIRDFContainer> container;
@ -2803,7 +2919,7 @@ nsChromeRegistry::GetAgentSheets(nsIDocShell* aDocShell, nsISupportsArray **aRes
elt->GetAttribute(NS_LITERAL_STRING("usechromesheets"), sheets);
if (!sheets.IsEmpty()) {
// Construct the URIs and try to load each sheet.
nsCAutoString sheetsStr; sheetsStr.AssignWithConversion(sheets);
char* str = ToNewCString(sheets);
char* newStr;
char* token = nsCRT::strtok( str, ", ", &newStr );
@ -2919,7 +3035,7 @@ nsresult nsChromeRegistry::GetUserSheetURL(PRBool aIsChrome, nsACString & aURL)
return NS_OK;
}
nsresult nsChromeRegistry::GetFormSheetURL(nsCString& aURL)
nsresult nsChromeRegistry::GetFormSheetURL(nsACString& aURL)
{
aURL = mUseXBLForms ? "chrome://forms/skin/forms.css" : "resource:/res/forms.css";
@ -3310,14 +3426,14 @@ NS_IMETHODIMP nsChromeRegistry::Observe(nsISupports *aSubject, const char *aTopi
return rv;
}
NS_IMETHODIMP nsChromeRegistry::CheckThemeVersion(const PRUnichar *aSkin,
NS_IMETHODIMP nsChromeRegistry::CheckThemeVersion(const nsACString& aSkin,
PRBool* aResult)
{
return CheckProviderVersion(NS_LITERAL_CSTRING("skin"), aSkin, mSkinVersion, aResult);
}
NS_IMETHODIMP nsChromeRegistry::CheckLocaleVersion(const PRUnichar *aLocale,
NS_IMETHODIMP nsChromeRegistry::CheckLocaleVersion(const nsACString& aLocale,
PRBool* aResult)
{
nsCAutoString provider("locale");
@ -3327,7 +3443,7 @@ NS_IMETHODIMP nsChromeRegistry::CheckLocaleVersion(const PRUnichar *aLocale,
nsresult
nsChromeRegistry::CheckProviderVersion (const nsACString& aProviderType,
const PRUnichar* aProviderName,
const nsACString& aProviderName,
nsIRDFResource* aSelectionArc,
PRBool *aCompatible)
{
@ -3338,7 +3454,7 @@ nsChromeRegistry::CheckProviderVersion (const nsACString& aProviderType,
nsCAutoString resourceStr( "urn:mozilla:" );
resourceStr += aProviderType;
resourceStr += ":";
resourceStr.AppendWithConversion(aProviderName);
resourceStr += aProviderName;
// Obtain the provider resource.
nsresult rv = NS_OK;

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

@ -53,7 +53,7 @@ class nsIDocument;
#include "nsIObserver.h"
#include "nsWeakReference.h"
#include "nsString.h"
#include "nsIZipReader.h"
// for component registration
// {D8C7D8A2-E84C-11d2-BF87-00105A1B0627}
@ -111,7 +111,7 @@ protected:
nsresult LoadStyleSheetWithURL(nsIURI* aURL, nsICSSStyleSheet** aSheet);
nsresult GetUserSheetURL(PRBool aIsChrome, nsACString & aURL);
nsresult GetFormSheetURL(nsCString& aURL);
nsresult GetFormSheetURL(nsACString& aURL);
nsresult LoadInstallDataSource();
nsresult LoadProfileDataSource();
@ -130,7 +130,7 @@ private:
nsresult RefreshWindow(nsIDOMWindowInternal* aWindow);
nsresult GetArcs(nsIRDFDataSource* aDataSource,
const nsCString& aType,
const nsACString& aType,
nsISimpleEnumerator** aResult);
nsresult AddToCompositeDataSource(PRBool aUseProfile);
@ -139,6 +139,12 @@ private:
const nsACString& aProvider,
nsACString& aBaseURL);
nsresult InitOverrideJAR();
nsresult GetOverrideURL(const nsACString& aPackage,
const nsACString& aProvider,
const nsACString& aPath,
nsACString& aResult);
nsresult FindProvider(const nsACString& aPackage,
const nsACString& aProvider,
nsIRDFResource *aArc,
@ -147,7 +153,7 @@ private:
nsresult SelectPackageInProvider(nsIRDFResource *aPackageList,
const nsACString& aPackage,
const nsACString& aProvider,
const nsCString& aProviderName,
const nsACString& aProviderName,
nsIRDFResource *aArc,
nsIRDFNode **aSelectedProvider);
@ -177,7 +183,7 @@ private:
nsACString& aResult);
nsresult CheckProviderVersion (const nsACString& aProviderType,
const PRUnichar* aProviderName,
const nsACString& aProviderName,
nsIRDFResource* aSelectionArc,
PRBool *aCompatible);
@ -239,6 +245,9 @@ protected:
nsCOMPtr<nsICSSStyleSheet> mUserContentSheet;
nsCOMPtr<nsICSSStyleSheet> mFormSheet;
nsCOMPtr<nsIZipReader> mOverrideJAR;
nsCString mOverrideJARURL;
PRBool mUseXBLForms;
PRPackedBool mInstallInitialized;

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

@ -37,6 +37,7 @@ REQUIRES = xpcom \
rdf \
necko \
content \
jar \
$(NULL)
CPPSRCS = nsChromeFactory.cpp

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

@ -105,8 +105,8 @@ interface nsIXULChromeRegistry : nsIChromeRegistry {
/* runtimeProvider == true: don't assert the runtime change */
void setRuntimeProvider(in boolean runtimeProvider);
boolean checkThemeVersion(in wstring skinName);
boolean checkLocaleVersion(in wstring localeName);
boolean checkThemeVersion(in ACString skinName);
boolean checkLocaleVersion(in ACString localeName);
/* Apply skin/locale to a specific package */
void selectSkinForPackage(in ACString skinName,

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

@ -46,6 +46,7 @@ REQUIRES = xpcom \
docshell \
imglib2 \
xpconnect \
jar \
$(NULL)
CPPSRCS = \

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

@ -539,6 +539,11 @@ nsChromeRegistry::ConvertChromeURL(nsIURI* aChromeURL, nsACString& aResult)
}
nsCAutoString finalURL;
rv = GetOverrideURL(package, provider, remaining, finalURL);
if (NS_SUCCEEDED(rv))
return NS_OK;
rv = GetBaseURL(package, provider, finalURL);
#ifdef DEBUG
if (NS_FAILED(rv)) {
@ -658,10 +663,122 @@ nsChromeRegistry::GetBaseURL(const nsACString& aPackage,
}
// From this resource, follow the "baseURL" arc.
return nsChromeRegistry::FollowArc(mChromeDataSource,
aBaseURL,
resource,
mBaseURL);
return FollowArc(mChromeDataSource, aBaseURL, resource, mBaseURL);
}
nsresult
nsChromeRegistry::GetOverrideURL(const nsACString& aPackage,
const nsACString& aProvider,
const nsACString& aPath,
nsACString& aResult)
{
nsresult rv = InitOverrideJAR();
if (NS_FAILED(rv)) return rv;
// ok, if we get here, we have an override JAR
aResult.SetCapacity(mOverrideJARURL.Length() +
aPackage.Length() +
aProvider.Length() +
aPath.Length() + 2);
aResult = mOverrideJARURL;
aResult += aPackage;
aResult += '/';
aResult += aProvider;
aResult += '/';
// skins and locales get their name tacked on, like
// skin/modern/foo.css or
// locale/en-US/navigator.properties
if (aProvider.Equals(NS_LITERAL_CSTRING("skin")) ||
aProvider.Equals(NS_LITERAL_CSTRING("locale"))) {
// little hack here to get the right arc
nsIRDFResource* providerArc;
if (aProvider.Equals("skin"))
providerArc = mSelectedSkin;
else
providerArc = mSelectedLocale;
nsCAutoString selectedProvider;
rv = GetSelectedProvider(aPackage, aProvider, providerArc, selectedProvider);
if (NS_SUCCEEDED(rv)) {
aResult += selectedProvider;
aResult += '/';
}
}
aResult += aPath;
nsCOMPtr<nsIZipEntry> zipEntry;
rv = mOverrideJAR->GetEntry(PromiseFlatCString(aResult).get(),
getter_AddRefs(zipEntry));
if (NS_FAILED(rv)) {
aResult.Truncate();
return rv;
}
return NS_OK;
}
nsresult
nsChromeRegistry::InitOverrideJAR()
{
// generic failure if we know there's no override
if (mSearchedForOverride && !mOverrideJAR)
return NS_ERROR_FAILURE;
mSearchedForOverride = PR_TRUE;
nsresult rv;
//
// look for custom.jar
//
nsCOMPtr<nsIFile> overrideFile;
rv = GetInstallRoot(getter_AddRefs(overrideFile));
if (NS_FAILED(rv)) return rv;
rv = overrideFile->AppendNative(NS_LITERAL_CSTRING("custom.jar"));
if (NS_FAILED(rv)) return rv;
PRBool exists;
rv = overrideFile->Exists(&exists);
if (NS_FAILED(rv)) return rv;
// ok, if the file doesn't exist, its just a generic failure
if (!exists)
return NS_ERROR_FAILURE;
//
// cache the url so we can later append
//
mOverrideJARURL.Assign("jar:");
nsCAutoString jarURL;
rv = NS_GetURLSpecFromFile(overrideFile, jarURL);
if (NS_FAILED(rv)) return rv;
mOverrideJARURL.Append(jarURL);
mOverrideJARURL.Append("!/");
if (NS_FAILED(rv)) return rv;
//
// also cache the zip file itself
//
nsCOMPtr<nsIZipReaderCache> readerCache =
do_CreateInstance("@mozilla.org/libjar/zip-reader-cache;1", &rv);
if (NS_FAILED(rv)) return rv;
rv = readerCache->Init(32);
rv = readerCache->GetZip(overrideFile, getter_AddRefs(mOverrideJAR));
if (NS_FAILED(rv)) {
mOverrideJARURL.Truncate();
return rv;
}
return NS_OK;
}
// locate
@ -746,7 +863,7 @@ nsresult
nsChromeRegistry::SelectPackageInProvider(nsIRDFResource *aPackageList,
const nsACString& aPackage,
const nsACString& aProvider,
const nsCString& aProviderName,
const nsACString& aProviderName,
nsIRDFResource *aArc,
nsIRDFNode **aSelectedProvider)
{
@ -2217,10 +2334,9 @@ nsChromeRegistry::InstallProvider(const nsACString& aProviderType,
if (NS_FAILED(rv)) return rv;
// Get the literal for our script access.
nsAutoString scriptstr;
scriptstr.Assign(NS_LITERAL_STRING("false"));
nsCOMPtr<nsIRDFLiteral> scriptLiteral;
rv = mRDFService->GetLiteral(scriptstr.get(), getter_AddRefs(scriptLiteral));
rv = mRDFService->GetLiteral(NS_LITERAL_STRING("false").get(),
getter_AddRefs(scriptLiteral));
if (NS_FAILED(rv)) return rv;
// Build the prefix string. Only resources with this prefix string will have their
@ -2639,8 +2755,8 @@ nsChromeRegistry::GetProfileRoot(nsACString& aFileURL)
// copy along
// It aint an error if these files dont exist
(void) defaultUserContentFile->CopyToNative(userChromeDir, nsCString());
(void) defaultUserChromeFile->CopyToNative(userChromeDir, nsCString());
(void) defaultUserContentFile->CopyToNative(userChromeDir, NS_LITERAL_CSTRING(""));
(void) defaultUserChromeFile->CopyToNative(userChromeDir, NS_LITERAL_CSTRING(""));
}
}
if (NS_FAILED(rv))
@ -2713,7 +2829,7 @@ nsChromeRegistry::ReloadChrome()
nsresult
nsChromeRegistry::GetArcs(nsIRDFDataSource* aDataSource,
const nsCString& aType,
const nsACString& aType,
nsISimpleEnumerator** aResult)
{
nsCOMPtr<nsIRDFContainer> container;
@ -2803,7 +2919,7 @@ nsChromeRegistry::GetAgentSheets(nsIDocShell* aDocShell, nsISupportsArray **aRes
elt->GetAttribute(NS_LITERAL_STRING("usechromesheets"), sheets);
if (!sheets.IsEmpty()) {
// Construct the URIs and try to load each sheet.
nsCAutoString sheetsStr; sheetsStr.AssignWithConversion(sheets);
char* str = ToNewCString(sheets);
char* newStr;
char* token = nsCRT::strtok( str, ", ", &newStr );
@ -2919,7 +3035,7 @@ nsresult nsChromeRegistry::GetUserSheetURL(PRBool aIsChrome, nsACString & aURL)
return NS_OK;
}
nsresult nsChromeRegistry::GetFormSheetURL(nsCString& aURL)
nsresult nsChromeRegistry::GetFormSheetURL(nsACString& aURL)
{
aURL = mUseXBLForms ? "chrome://forms/skin/forms.css" : "resource:/res/forms.css";
@ -3310,14 +3426,14 @@ NS_IMETHODIMP nsChromeRegistry::Observe(nsISupports *aSubject, const char *aTopi
return rv;
}
NS_IMETHODIMP nsChromeRegistry::CheckThemeVersion(const PRUnichar *aSkin,
NS_IMETHODIMP nsChromeRegistry::CheckThemeVersion(const nsACString& aSkin,
PRBool* aResult)
{
return CheckProviderVersion(NS_LITERAL_CSTRING("skin"), aSkin, mSkinVersion, aResult);
}
NS_IMETHODIMP nsChromeRegistry::CheckLocaleVersion(const PRUnichar *aLocale,
NS_IMETHODIMP nsChromeRegistry::CheckLocaleVersion(const nsACString& aLocale,
PRBool* aResult)
{
nsCAutoString provider("locale");
@ -3327,7 +3443,7 @@ NS_IMETHODIMP nsChromeRegistry::CheckLocaleVersion(const PRUnichar *aLocale,
nsresult
nsChromeRegistry::CheckProviderVersion (const nsACString& aProviderType,
const PRUnichar* aProviderName,
const nsACString& aProviderName,
nsIRDFResource* aSelectionArc,
PRBool *aCompatible)
{
@ -3338,7 +3454,7 @@ nsChromeRegistry::CheckProviderVersion (const nsACString& aProviderType,
nsCAutoString resourceStr( "urn:mozilla:" );
resourceStr += aProviderType;
resourceStr += ":";
resourceStr.AppendWithConversion(aProviderName);
resourceStr += aProviderName;
// Obtain the provider resource.
nsresult rv = NS_OK;

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

@ -53,7 +53,7 @@ class nsIDocument;
#include "nsIObserver.h"
#include "nsWeakReference.h"
#include "nsString.h"
#include "nsIZipReader.h"
// for component registration
// {D8C7D8A2-E84C-11d2-BF87-00105A1B0627}
@ -111,7 +111,7 @@ protected:
nsresult LoadStyleSheetWithURL(nsIURI* aURL, nsICSSStyleSheet** aSheet);
nsresult GetUserSheetURL(PRBool aIsChrome, nsACString & aURL);
nsresult GetFormSheetURL(nsCString& aURL);
nsresult GetFormSheetURL(nsACString& aURL);
nsresult LoadInstallDataSource();
nsresult LoadProfileDataSource();
@ -130,7 +130,7 @@ private:
nsresult RefreshWindow(nsIDOMWindowInternal* aWindow);
nsresult GetArcs(nsIRDFDataSource* aDataSource,
const nsCString& aType,
const nsACString& aType,
nsISimpleEnumerator** aResult);
nsresult AddToCompositeDataSource(PRBool aUseProfile);
@ -139,6 +139,12 @@ private:
const nsACString& aProvider,
nsACString& aBaseURL);
nsresult InitOverrideJAR();
nsresult GetOverrideURL(const nsACString& aPackage,
const nsACString& aProvider,
const nsACString& aPath,
nsACString& aResult);
nsresult FindProvider(const nsACString& aPackage,
const nsACString& aProvider,
nsIRDFResource *aArc,
@ -147,7 +153,7 @@ private:
nsresult SelectPackageInProvider(nsIRDFResource *aPackageList,
const nsACString& aPackage,
const nsACString& aProvider,
const nsCString& aProviderName,
const nsACString& aProviderName,
nsIRDFResource *aArc,
nsIRDFNode **aSelectedProvider);
@ -177,7 +183,7 @@ private:
nsACString& aResult);
nsresult CheckProviderVersion (const nsACString& aProviderType,
const PRUnichar* aProviderName,
const nsACString& aProviderName,
nsIRDFResource* aSelectionArc,
PRBool *aCompatible);
@ -239,6 +245,9 @@ protected:
nsCOMPtr<nsICSSStyleSheet> mUserContentSheet;
nsCOMPtr<nsICSSStyleSheet> mFormSheet;
nsCOMPtr<nsIZipReader> mOverrideJAR;
nsCString mOverrideJARURL;
PRBool mUseXBLForms;
PRPackedBool mInstallInitialized;