From 6da29eda0b835c815bc9b568f5c3cf495ec1d147 Mon Sep 17 00:00:00 2001 From: Haik Aftandilian Date: Wed, 4 Oct 2017 10:43:49 -0700 Subject: [PATCH] Bug 1393805 - Part 1 - Add XRE_USER_SYS_EXTENSION_DEV_DIR XRESysExtDev Key. r=bobowen,gcp Adds a new directory provider key "XRESysExtDev" to be used by system extension developers needing to load system extensions from a directory readable by sandboxed content processes. MozReview-Commit-ID: 4BKOZoPzCC3 --HG-- extra : rebase_source : 452db8d53a1f0248a080f858c48492978b5db808 --- toolkit/xre/nsXREDirProvider.cpp | 53 ++++++++++++++++++++++++++++++++ toolkit/xre/nsXREDirProvider.h | 2 ++ xpcom/build/nsXULAppAPI.h | 6 ++++ 3 files changed, 61 insertions(+) diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp index 546612d39562..7d9247cda9cb 100644 --- a/toolkit/xre/nsXREDirProvider.cpp +++ b/toolkit/xre/nsXREDirProvider.cpp @@ -478,6 +478,9 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent, return NS_ERROR_FAILURE; #endif } + else if (!strcmp(aProperty, XRE_USER_SYS_EXTENSION_DEV_DIR)) { + return GetSysUserExtensionsDevDirectory(aFile); + } else if (!strcmp(aProperty, XRE_APP_DISTRIBUTION_DIR)) { bool persistent = false; rv = GetFile(NS_GRE_DIR, &persistent, getter_AddRefs(file)); @@ -1522,6 +1525,23 @@ nsXREDirProvider::GetSysUserExtensionsDirectory(nsIFile** aFile) return NS_OK; } +nsresult +nsXREDirProvider::GetSysUserExtensionsDevDirectory(nsIFile** aFile) +{ + nsCOMPtr localDir; + nsresult rv = GetUserDataDirectoryHome(getter_AddRefs(localDir), false); + NS_ENSURE_SUCCESS(rv, rv); + + rv = AppendSysUserExtensionsDevPath(localDir); + NS_ENSURE_SUCCESS(rv, rv); + + rv = EnsureDirectoryExists(localDir); + NS_ENSURE_SUCCESS(rv, rv); + + localDir.forget(aFile); + return NS_OK; +} + #if defined(XP_UNIX) || defined(XP_MACOSX) nsresult nsXREDirProvider::GetSystemExtensionsDirectory(nsIFile** aFile) @@ -1629,6 +1649,39 @@ nsXREDirProvider::AppendSysUserExtensionPath(nsIFile* aFile) return NS_OK; } +nsresult +nsXREDirProvider::AppendSysUserExtensionsDevPath(nsIFile* aFile) +{ + MOZ_ASSERT(aFile); + + nsresult rv; + +#if defined (XP_MACOSX) || defined(XP_WIN) + + static const char* const sXR = "Mozilla"; + rv = aFile->AppendNative(nsDependentCString(sXR)); + NS_ENSURE_SUCCESS(rv, rv); + + static const char* const sExtensions = "SystemExtensionsDev"; + rv = aFile->AppendNative(nsDependentCString(sExtensions)); + NS_ENSURE_SUCCESS(rv, rv); + +#elif defined(XP_UNIX) + + static const char* const sXR = ".mozilla"; + rv = aFile->AppendNative(nsDependentCString(sXR)); + NS_ENSURE_SUCCESS(rv, rv); + + static const char* const sExtensions = "systemextensionsdev"; + rv = aFile->AppendNative(nsDependentCString(sExtensions)); + NS_ENSURE_SUCCESS(rv, rv); + +#else +#error "Don't know how to get XRE system extension dev path on your platform" +#endif + return NS_OK; +} + nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, diff --git a/toolkit/xre/nsXREDirProvider.h b/toolkit/xre/nsXREDirProvider.h index c209de53db16..cdc01df54776 100644 --- a/toolkit/xre/nsXREDirProvider.h +++ b/toolkit/xre/nsXREDirProvider.h @@ -104,6 +104,7 @@ protected: nsresult GetFilesInternal(const char* aProperty, nsISimpleEnumerator** aResult); static nsresult GetUserDataDirectoryHome(nsIFile* *aFile, bool aLocal); static nsresult GetSysUserExtensionsDirectory(nsIFile* *aFile); + static nsresult GetSysUserExtensionsDevDirectory(nsIFile* *aFile); #if defined(XP_UNIX) || defined(XP_MACOSX) static nsresult GetSystemExtensionsDirectory(nsIFile** aFile); #endif @@ -118,6 +119,7 @@ protected: bool aLocal); static nsresult AppendSysUserExtensionPath(nsIFile* aFile); + static nsresult AppendSysUserExtensionsDevPath(nsIFile* aFile); // Internal helper that splits a path into components using the '/' and '\\' // delimiters. diff --git a/xpcom/build/nsXULAppAPI.h b/xpcom/build/nsXULAppAPI.h index 293d10617170..881596cf0cb2 100644 --- a/xpcom/build/nsXULAppAPI.h +++ b/xpcom/build/nsXULAppAPI.h @@ -128,6 +128,12 @@ */ #define XRE_USER_SYS_EXTENSION_DIR "XREUSysExt" +/** + * A directory service key which specifies a directory where temporary + * system extensions can be loaded from during development. + */ +#define XRE_USER_SYS_EXTENSION_DEV_DIR "XRESysExtDev" + /** * A directory service key which specifies the distribution specific files for * the application.