Backed out changeset 207925bbf88d (bug 1403366)
authorSebastian Hengst <archaeopteryx@coole-files.de>
Wed, 04 Oct 2017 01:27:02 +0200
changeset 426952 de17c3ee3de4b1fe839a4cc64f244db454ee2bc4
parent 426951 7cdf44b91cbe430823b6fe9592a714c242a6faa0
child 426953 cadb2bf153615d095f29c141c3bf93d0db427a48
push id97
push userfmarier@mozilla.com
push dateSat, 14 Oct 2017 01:12:59 +0000
bugs1403366
milestone58.0a1
backs out207925bbf88d3e20d791c479a8f4e2727b6829c4
Backed out changeset 207925bbf88d (bug 1403366)
netwerk/test/httpserver/test/test_basic_functionality.js
xpcom/io/moz.build
xpcom/io/nsDirectoryService.cpp
--- a/netwerk/test/httpserver/test/test_basic_functionality.js
+++ b/netwerk/test/httpserver/test/test_basic_functionality.js
@@ -30,17 +30,17 @@ var srv;
 function run_test()
 {
   srv = createServer();
 
   // base path
   // XXX should actually test this works with a file by comparing streams!
   var dirServ = Cc["@mozilla.org/file/directory_service;1"]
                   .getService(Ci.nsIProperties);
-  var path = dirServ.get("CurWorkD", Ci.nsIFile);
+  var path = dirServ.get("CurProcD", Ci.nsIFile);
   srv.registerDirectory("/", path);
 
   // register a few test paths
   srv.registerPathHandler("/objHandler", objHandler);
   srv.registerPathHandler("/functionHandler", functionHandler);
   srv.registerPathHandler("/lotsOfHeaders", lotsOfHeadersHandler);
 
   srv.start(-1);
--- a/xpcom/io/moz.build
+++ b/xpcom/io/moz.build
@@ -127,18 +127,15 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'coco
 
 include('/ipc/chromium/chromium-config.mozbuild')
 
 FINAL_LIBRARY = 'xul'
 
 if CONFIG['OS_ARCH'] == 'Linux' and 'lib64' in CONFIG['libdir']:
     DEFINES['HAVE_USR_LIB64_DIR'] = True
 
-LOCAL_INCLUDES += [
-    '!..',
-    '../build',
-]
+LOCAL_INCLUDES += ['!..']
 
 if CONFIG['_MSC_VER']:
     # This is intended as a temporary hack to support building with VS2015.
     # '_snwprintf' : format string '%s' requires an argument of type 'wchar_t *',
     # but variadic argument 3 has type 'char16ptr_t'
     CXXFLAGS += ['-wd4477']
--- a/xpcom/io/nsDirectoryService.cpp
+++ b/xpcom/io/nsDirectoryService.cpp
@@ -32,17 +32,16 @@
 #ifdef MOZ_WIDGET_COCOA
 #include <CoreServices/CoreServices.h>
 #include <Carbon/Carbon.h>
 #endif
 #endif
 
 #include "SpecialSystemDirectory.h"
 #include "nsAppFileLocationProvider.h"
-#include "BinaryPath.h"
 
 using namespace mozilla;
 
 // define home directory
 // For Windows platform, We are choosing Appdata folder as HOME
 #if defined (XP_WIN)
 #define HOME_DIR NS_WIN_APPDATA_DIR
 #elif defined (MOZ_WIDGET_COCOA)
@@ -69,19 +68,119 @@ nsDirectoryService::GetCurrentProcessDir
   nsCOMPtr<nsIFile> file;
   gService->Get(NS_XPCOM_INIT_CURRENT_PROCESS_DIR, NS_GET_IID(nsIFile),
                 getter_AddRefs(file));
   if (file) {
     file.forget(aFile);
     return NS_OK;
   }
 
-  if (NS_SUCCEEDED(BinaryPath::GetFile(getter_AddRefs(file)))) {
-    return file->GetParent(aFile);
+  RefPtr<nsLocalFile> localFile = new nsLocalFile;
+
+#ifdef XP_WIN
+  wchar_t buf[MAX_PATH + 1];
+  SetLastError(ERROR_SUCCESS);
+  if (GetModuleFileNameW(0, buf, mozilla::ArrayLength(buf)) &&
+      GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
+    // chop off the executable name by finding the rightmost backslash
+    wchar_t* lastSlash = wcsrchr(buf, L'\\');
+    if (lastSlash) {
+      *(lastSlash + 1) = L'\0';
+    }
+
+    localFile->InitWithPath(nsDependentString(buf));
+    localFile.forget(aFile);
+    return NS_OK;
+  }
+
+#elif defined(MOZ_WIDGET_COCOA)
+  // Works even if we're not bundled.
+  CFBundleRef appBundle = CFBundleGetMainBundle();
+  if (appBundle) {
+    CFURLRef bundleURL = CFBundleCopyExecutableURL(appBundle);
+    if (bundleURL) {
+      CFURLRef parentURL = CFURLCreateCopyDeletingLastPathComponent(
+        kCFAllocatorDefault, bundleURL);
+      if (parentURL) {
+        // Pass true for the "resolveAgainstBase" arg to CFURLGetFileSystemRepresentation.
+        // This will resolve the relative portion of the CFURL against it base, giving a full
+        // path, which CFURLCopyFileSystemPath doesn't do.
+        char buffer[PATH_MAX];
+        if (CFURLGetFileSystemRepresentation(parentURL, true,
+                                             (UInt8*)buffer, sizeof(buffer))) {
+#ifdef DEBUG_conrad
+          printf("nsDirectoryService - CurrentProcessDir is: %s\n", buffer);
+#endif
+          nsresult rv = localFile->InitWithNativePath(nsDependentCString(buffer));
+          if (NS_SUCCEEDED(rv)) {
+            localFile.forget(aFile);
+          }
+        }
+        CFRelease(parentURL);
+      }
+      CFRelease(bundleURL);
+    }
+  }
+
+  NS_ASSERTION(*aFile, "nsDirectoryService - Could not determine CurrentProcessDir.\n");
+  if (*aFile) {
+    return NS_OK;
   }
+
+#elif defined(XP_UNIX)
+
+  // In the absence of a good way to get the executable directory let
+  // us try this for unix:
+  //    - if MOZILLA_FIVE_HOME is defined, that is it
+  //    - else give the current directory
+  char buf[MAXPATHLEN];
+
+  // The MOZ_DEFAULT_MOZILLA_FIVE_HOME variable can be set at configure time with
+  // a --with-default-mozilla-five-home=foo autoconf flag.
+  //
+  // The idea here is to allow for builds that have a default MOZILLA_FIVE_HOME
+  // regardless of the environment.  This makes it easier to write apps that
+  // embed mozilla without having to worry about setting up the environment
+  //
+  // We do this by putenv()ing the default value into the environment.  Note that
+  // we only do this if it is not already set.
+#ifdef MOZ_DEFAULT_MOZILLA_FIVE_HOME
+  const char* home = PR_GetEnv("MOZILLA_FIVE_HOME");
+  if (!home || !*home) {
+    putenv("MOZILLA_FIVE_HOME=" MOZ_DEFAULT_MOZILLA_FIVE_HOME);
+  }
+#endif
+
+  char* moz5 = PR_GetEnv("MOZILLA_FIVE_HOME");
+  if (moz5 && *moz5) {
+    if (realpath(moz5, buf)) {
+      localFile->InitWithNativePath(nsDependentCString(buf));
+      localFile.forget(aFile);
+      return NS_OK;
+    }
+  }
+#if defined(DEBUG)
+  static bool firstWarning = true;
+
+  if ((!moz5 || !*moz5) && firstWarning) {
+    // Warn that MOZILLA_FIVE_HOME not set, once.
+    printf("Warning: MOZILLA_FIVE_HOME not set.\n");
+    firstWarning = false;
+  }
+#endif /* DEBUG */
+
+  // Fall back to current directory.
+  if (getcwd(buf, sizeof(buf))) {
+    localFile->InitWithNativePath(nsDependentCString(buf));
+    localFile.forget(aFile);
+    return NS_OK;
+  }
+
+#endif
+
   NS_ERROR("unable to get current process directory");
   return NS_ERROR_FAILURE;
 } // GetCurrentProcessDirectory()
 
 StaticRefPtr<nsDirectoryService> nsDirectoryService::gService;
 
 nsDirectoryService::nsDirectoryService()
   : mHashtable(128)