[tor-commits] [tor-browser/tor-browser-31.5.0esr-4.5-1] Bug 14631: Improve profile access error msgs (strings).

mikeperry at torproject.org mikeperry at torproject.org
Wed Mar 18 03:58:48 UTC 2015


commit ce2343957e7617ffa47c5b2b8b2a3128916ac92e
Author: Kathy Brade <brade at pearlcrescent.com>
Date:   Fri Feb 27 10:38:40 2015 -0500

    Bug 14631: Improve profile access error msgs (strings).
    
    To allow for localization, get profile-related error strings from Torbutton.
    Use app display name ("Tor Browser") in profile-related error alerts.
---
 toolkit/xre/moz.build       |    4 +-
 toolkit/xre/nsAppRunner.cpp |  116 ++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 111 insertions(+), 9 deletions(-)

diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build
index a13a9ef..a1a875b 100644
--- a/toolkit/xre/moz.build
+++ b/toolkit/xre/moz.build
@@ -109,8 +109,8 @@ FINAL_LIBRARY = 'xul'
 if CONFIG['MOZ_GL_DEFAULT_PROVIDER'] == 'GLX':
     DEFINES['USE_GLX_TEST'] = True
 
-for var in ('MOZ_APP_NAME', 'MOZ_APP_BASENAME', 'MOZ_APP_VERSION', 'OS_TARGET',
-            'MOZ_WIDGET_TOOLKIT'):
+for var in ('MOZ_APP_NAME', 'MOZ_APP_BASENAME', 'MOZ_APP_DISPLAYNAME',
+            'MOZ_APP_VERSION', 'OS_TARGET', 'MOZ_WIDGET_TOOLKIT'):
     DEFINES[var] = '"%s"' % CONFIG[var]
 
 if CONFIG['MOZ_UPDATER'] and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'android':
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index dbd1376..dc7d424 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -1682,6 +1682,104 @@ static nsresult LaunchChild(nsINativeAppSupport* aNative,
   return NS_ERROR_LAUNCHED_CHILD_PROCESS;
 }
 
+static nsresult
+GetOverrideStringBundleForLocale(nsIStringBundleService* aSBS,
+                                 const char* aTorbuttonURI, const char* aLocale,
+                                 nsIStringBundle* *aResult)
+{
+  NS_ENSURE_ARG(aSBS);
+  NS_ENSURE_ARG(aTorbuttonURI);
+  NS_ENSURE_ARG(aLocale);
+  NS_ENSURE_ARG(aResult);
+
+  const char* kFormatStr = "jar:%s!/chrome/locale/%s/torbutton.properties";
+  nsPrintfCString strBundleURL(kFormatStr, aTorbuttonURI, aLocale);
+  nsresult rv = aSBS->CreateBundle(strBundleURL.get(), aResult);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  // To ensure that we have a valid string bundle, try to retrieve a string
+  // that we know exists.
+  nsXPIDLString val;
+  rv = (*aResult)->GetStringFromName(MOZ_UTF16("profileProblemTitle"),
+                                     getter_Copies(val));
+  if (!NS_SUCCEEDED(rv))
+    *aResult = nullptr;  // No good.  Discard it.
+
+  return rv;
+}
+
+static void
+GetOverrideStringBundle(nsIStringBundleService* aSBS, nsIStringBundle* *aResult)
+{
+  if (!aSBS || !aResult)
+    return;
+
+  *aResult = nullptr;
+
+  // Build Torbutton file URI string by starting from the profiles directory.
+  nsXREDirProvider* dirProvider = nsXREDirProvider::GetSingleton();
+  if (!dirProvider)
+    return;
+
+  bool persistent = false; // ignored
+  nsCOMPtr<nsIFile> profilesDir;
+  nsresult rv = dirProvider->GetFile(NS_APP_USER_PROFILES_ROOT_DIR, &persistent,
+                                     getter_AddRefs(profilesDir));
+  if (NS_FAILED(rv))
+    return;
+
+  // Create file URI, extract as string, and append Torbutton xpi relative path.
+  nsCOMPtr<nsIURI> uri;
+  nsAutoCString uriString;
+  if (NS_FAILED(NS_NewFileURI(getter_AddRefs(uri), profilesDir)) ||
+      NS_FAILED(uri->GetSpec(uriString))) {
+    return;
+  }
+
+  uriString.Append("profile.default/extensions/torbutton at torproject.org.xpi");
+
+  nsCString userAgentLocale;
+  if (!NS_SUCCEEDED(Preferences::GetCString("general.useragent.locale",
+                                            &userAgentLocale))) {
+    return;
+  }
+
+  rv = GetOverrideStringBundleForLocale(aSBS, uriString.get(),
+                                   userAgentLocale.get(), aResult);
+  if (NS_FAILED(rv)) {
+    // Try again using base locale, e.g., "en" vs. "en-US".
+    int16_t offset = userAgentLocale.FindChar('-', 1);
+    if (offset > 0) {
+      nsAutoCString shortLocale(Substring(userAgentLocale, 0, offset));
+      rv = GetOverrideStringBundleForLocale(aSBS, uriString.get(),
+                                       shortLocale.get(), aResult);
+    }
+  }
+}
+
+static nsresult
+GetFormattedString(nsIStringBundle* aOverrideBundle,
+                   nsIStringBundle* aMainBundle,
+                   const char16_t* aName,
+                   const char16_t** aParams, uint32_t aLength,
+                   char16_t* *aResult)
+{
+  NS_ENSURE_ARG(aName);
+  NS_ENSURE_ARG(aResult);
+
+  nsresult rv = NS_ERROR_FAILURE;
+  if (aOverrideBundle) {
+    rv = aOverrideBundle->FormatStringFromName(aName, aParams, aLength,
+                                               aResult);
+  }
+
+  // If string was not found in override bundle, use main (browser) bundle.
+  if (NS_FAILED(rv) && aMainBundle)
+    rv = aMainBundle->FormatStringFromName(aName, aParams, aLength, aResult);
+
+  return rv;
+}
+
 enum ProfileStatus {
   PROFILE_STATUS_OK,
   PROFILE_STATUS_ACCESS_DENIED,
@@ -1718,7 +1816,10 @@ ProfileErrorDialog(nsIFile* aProfileDir, nsIFile* aProfileLocalDir,
     sbs->CreateBundle(kProfileProperties, getter_AddRefs(sb));
     NS_ENSURE_TRUE_LOG(sbs, NS_ERROR_FAILURE);
 
-    NS_ConvertUTF8toUTF16 appName(gAppData->name);
+    nsCOMPtr<nsIStringBundle> overrideSB;
+    GetOverrideStringBundle(sbs, getter_AddRefs(overrideSB));
+
+    NS_ConvertUTF8toUTF16 appName(MOZ_APP_DISPLAYNAME);
     const char16_t* params[] = {appName.get(), appName.get()};
 
     nsXPIDLString killMessage;
@@ -1734,21 +1835,22 @@ ProfileErrorDialog(nsIFile* aProfileDir, nsIFile* aProfileLocalDir,
 
     static const char16_t kAccessDenied[] = {'p','r','o','f','i','l','e','A','c','c','e','s','s','D','e','n','i','e','d','\0'}; // "profileAccessDenied"
 
-    const char16_t *errorKey = aUnlocker ? kRestartUnlocker
+    const char16_t* errorKey = aUnlocker ? kRestartUnlocker
                                          : kRestartNoUnlocker;
     if (PROFILE_STATUS_READ_ONLY == aStatus)
       errorKey = kReadOnly;
     else if (PROFILE_STATUS_ACCESS_DENIED == aStatus)
       errorKey = kAccessDenied;
-    sb->FormatStringFromName(errorKey, params, 2, getter_Copies(killMessage));
+    GetFormattedString(overrideSB, sb, errorKey, params, 2,
+                       getter_Copies(killMessage));
 
-    const char16_t *titleKey = ((PROFILE_STATUS_READ_ONLY == aStatus) ||
+    const char16_t* titleKey = ((PROFILE_STATUS_READ_ONLY == aStatus) ||
                                 (PROFILE_STATUS_ACCESS_DENIED == aStatus))
                                    ? MOZ_UTF16("profileProblemTitle")
                                    : MOZ_UTF16("restartTitle");
     nsXPIDLString killTitle;
-    sb->FormatStringFromName(titleKey, params, 1, getter_Copies(killTitle));
-
+    GetFormattedString(overrideSB, sb, titleKey, params, 1,
+                       getter_Copies(killTitle));
     if (!killMessage || !killTitle)
       return NS_ERROR_FAILURE;
 
@@ -1822,7 +1924,7 @@ ProfileMissingDialog(nsINativeAppSupport* aNative)
     sbs->CreateBundle(kProfileProperties, getter_AddRefs(sb));
     NS_ENSURE_TRUE_LOG(sbs, NS_ERROR_FAILURE);
   
-    NS_ConvertUTF8toUTF16 appName(gAppData->name);
+    NS_ConvertUTF8toUTF16 appName(MOZ_APP_DISPLAYNAME);
     const char16_t* params[] = {appName.get(), appName.get()};
   
     nsXPIDLString missingMessage;



More information about the tor-commits mailing list