Bug 483202 - Load chrome from the GRE directory in xpcshell, r=ted

This commit is contained in:
Benjamin Smedberg 2009-07-17 10:41:26 -04:00
Родитель 888bd4b9f3
Коммит 625bae93d8
2 изменённых файлов: 48 добавлений и 14 удалений

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

@ -62,10 +62,14 @@
#include "nsIDirectoryService.h"
#include "nsILocalFile.h"
#include "nsDirectoryServiceDefs.h"
#include "nsAppDirectoryServiceDefs.h"
#include "jsapi.h"
#include "jsdbgapi.h"
#include "jsprf.h"
#include "nscore.h"
#include "nsArrayEnumerator.h"
#include "nsCOMArray.h"
#include "nsDirectoryServiceUtils.h"
#include "nsMemory.h"
#include "nsIGenericFactory.h"
#include "nsISupportsImpl.h"
@ -97,11 +101,12 @@
#include "nsIJSContextStack.h"
class XPCShellDirProvider : public nsIDirectoryServiceProvider
class XPCShellDirProvider : public nsIDirectoryServiceProvider2
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIDIRECTORYSERVICEPROVIDER
NS_DECL_NSIDIRECTORYSERVICEPROVIDER2
XPCShellDirProvider() { }
~XPCShellDirProvider() { }
@ -1803,7 +1808,9 @@ XPCShellDirProvider::Release()
return 1;
}
NS_IMPL_QUERY_INTERFACE1(XPCShellDirProvider, nsIDirectoryServiceProvider)
NS_IMPL_QUERY_INTERFACE2(XPCShellDirProvider,
nsIDirectoryServiceProvider,
nsIDirectoryServiceProvider2)
NS_IMETHODIMP
XPCShellDirProvider::GetFile(const char *prop, PRBool *persistent,
@ -1817,3 +1824,24 @@ XPCShellDirProvider::GetFile(const char *prop, PRBool *persistent,
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XPCShellDirProvider::GetFiles(const char *prop, nsISimpleEnumerator* *result)
{
if (mGREDir && !strcmp(prop, "ChromeML")) {
nsCOMArray<nsIFile> dirs;
nsCOMPtr<nsIFile> file;
mGREDir->Clone(getter_AddRefs(file));
file->AppendNative(NS_LITERAL_CSTRING("chrome"));
dirs.AppendObject(file);
nsresult rv = NS_GetSpecialDirectory(NS_APP_CHROME_DIR,
getter_AddRefs(file));
if (NS_SUCCEEDED(rv))
dirs.AppendObject(file);
return NS_NewArrayEnumerator(result, dirs);
}
return NS_ERROR_FAILURE;
}

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

@ -790,7 +790,7 @@ nsDirectoryService::GetFile(const char *prop, PRBool *persistent, nsIFile **_ret
*_retval = nsnull;
*persistent = PR_TRUE;
nsIAtom* inAtom = NS_NewAtom(prop);
nsCOMPtr<nsIAtom> inAtom = do_GetAtom(prop);
// check to see if it is one of our defaults
@ -830,14 +830,22 @@ nsDirectoryService::GetFile(const char *prop, PRBool *persistent, nsIFile **_ret
else if (inAtom == nsDirectoryService::sGRE_ComponentDirectory)
{
rv = Get(NS_GRE_DIR, NS_GET_IID(nsILocalFile), getter_AddRefs(localFile));
if (localFile)
localFile->AppendNative(COMPONENT_DIRECTORY);
if (localFile) {
nsCOMPtr<nsIFile> cdir;
localFile->Clone(getter_AddRefs(cdir));
cdir->AppendNative(COMPONENT_DIRECTORY);
localFile = do_QueryInterface(cdir);
}
}
else if (inAtom == nsDirectoryService::sComponentDirectory)
{
rv = GetCurrentProcessDirectory(getter_AddRefs(localFile));
if (localFile)
localFile->AppendNative(COMPONENT_DIRECTORY);
if (localFile) {
nsCOMPtr<nsIFile> cdir;
localFile->Clone(getter_AddRefs(cdir));
cdir->AppendNative(COMPONENT_DIRECTORY);
localFile = do_QueryInterface(cdir);
}
}
else if (inAtom == nsDirectoryService::sOS_DriveDirectory)
{
@ -1205,15 +1213,13 @@ nsDirectoryService::GetFile(const char *prop, PRBool *persistent, nsIFile **_ret
}
#endif
if (NS_FAILED(rv))
return rv;
NS_RELEASE(inAtom);
if (!localFile)
return NS_ERROR_FAILURE;
if (localFile && NS_SUCCEEDED(rv))
return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)_retval);
#ifdef DEBUG_dougt
printf("Failed to find directory for key: %s\n", prop);
#endif
return rv;
return CallQueryInterface(localFile, _retval);
}
NS_IMETHODIMP