summaryrefslogtreecommitdiff
path: root/mozilla-1097550-dict-fix.patch
blob: fa7747728b086512b52749e501a1e59e86a11f17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# HG changeset patch
# Parent 2c9781c3e9b5004d6070f62f3b14b517fc692150
# User Jan Horak <jhorak@redhat.com>
# Bug 1097550 - convert underscore in dictionary name to dash before calling nsStyleUtil::DashMatchCompare

diff --git a/editor/composer/nsEditorSpellCheck.cpp b/editor/composer/nsEditorSpellCheck.cpp
--- a/editor/composer/nsEditorSpellCheck.cpp
+++ b/editor/composer/nsEditorSpellCheck.cpp
@@ -101,16 +101,33 @@ GetLoadContext(nsIEditor* aEditor)
   nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc);
   NS_ENSURE_TRUE(doc, nullptr);
 
   nsCOMPtr<nsILoadContext> loadContext = doc->GetLoadContext();
   return loadContext.forget();
 }
 
 /**
+ * Helper function for converting underscore to dash in dictionary name,
+ * ie. en_CA to en-CA. This is required for some Linux distributions which
+ * use underscore as separator in system-wide installed dictionaries.
+ * We use it for nsStyleUtil::DashMatchCompare.
+ */
+static nsString
+GetDictNameWithDash(const nsAString& aDictName)
+{
+  nsString dictNameWithDash(aDictName);
+  int32_t underScore = dictNameWithDash.FindChar('_');
+  if (underScore != -1) {
+    dictNameWithDash.Replace(underScore, 1, '-');
+  }
+  return dictNameWithDash;
+}
+
+/**
  * Fetches the dictionary stored in content prefs and maintains state during the
  * fetch, which is asynchronous.
  */
 class DictionaryFetcher MOZ_FINAL : public nsIContentPrefCallback2
 {
 public:
   NS_DECL_ISUPPORTS
 
@@ -598,18 +615,18 @@ nsEditorSpellCheck::SetCurrentDictionary
     nsDefaultStringComparator comparator;
     nsAutoString langCode;
     int32_t dashIdx = aDictionary.FindChar('-');
     if (dashIdx != -1) {
       langCode.Assign(Substring(aDictionary, 0, dashIdx));
     } else {
       langCode.Assign(aDictionary);
     }
-
-    if (mPreferredLang.IsEmpty() || !nsStyleUtil::DashMatchCompare(mPreferredLang, langCode, comparator)) {
+    if (mPreferredLang.IsEmpty() ||
+        !nsStyleUtil::DashMatchCompare(GetDictNameWithDash(mPreferredLang), langCode, comparator)) {
       // When user sets dictionary manually, we store this value associated
       // with editor url.
       StoreCurrentDictionary(mEditor, aDictionary);
     } else {
       // If user sets a dictionary matching (even partially), lang defined by
       // document, we consider content pref has been canceled, and we clear it.
       ClearCurrentDictionary(mEditor);
     }
@@ -745,22 +762,16 @@ nsEditorSpellCheck::DictionaryFetched(Di
 
   // Then, try to use language computed from element
   if (!mPreferredLang.IsEmpty()) {
     dictName.Assign(mPreferredLang);
   }
 
   // otherwise, get language from preferences
   nsAutoString preferedDict(Preferences::GetLocalizedString("spellchecker.dictionary"));
-  // Replace '_' with '-' in case the user has an underscore stored in their
-  // pref, see bug 992118 for how this could have happened.
-  int32_t underScore = preferedDict.FindChar('_');
-  if (underScore != -1) {
-    preferedDict.Replace(underScore, 1, '-');
-  }
   if (dictName.IsEmpty()) {
     dictName.Assign(preferedDict);
   }
 
   nsresult rv = NS_OK;
   if (dictName.IsEmpty()) {
     // Prefs didn't give us a dictionary name, so just get the current
     // locale and use that as the default dictionary name!
@@ -789,18 +800,18 @@ nsEditorSpellCheck::DictionaryFetched(Di
       } else {
         langCode.Assign(dictName);
       }
 
       nsDefaultStringComparator comparator;
 
       // try dictionary.spellchecker preference if it starts with langCode (and
       // if we haven't tried it already)
-      if (!preferedDict.IsEmpty() && !dictName.Equals(preferedDict) && 
-          nsStyleUtil::DashMatchCompare(preferedDict, langCode, comparator)) {
+      if (!preferedDict.IsEmpty() && !dictName.Equals(preferedDict) &&
+          nsStyleUtil::DashMatchCompare(GetDictNameWithDash(preferedDict), langCode, comparator)) {
         rv = SetCurrentDictionary(preferedDict);
       }
 
       // Otherwise, try langCode (if we haven't tried it already)
       if (NS_FAILED(rv)) {
         if (!dictName.Equals(langCode) && !preferedDict.Equals(langCode)) {
           rv = SetCurrentDictionary(langCode);
         }
@@ -818,18 +829,17 @@ nsEditorSpellCheck::DictionaryFetched(Di
           nsAutoString dictStr(dictList.ElementAt(i));
 
           if (dictStr.Equals(dictName) ||
               dictStr.Equals(preferedDict) ||
               dictStr.Equals(langCode)) {
             // We have already tried it
             continue;
           }
-
-          if (nsStyleUtil::DashMatchCompare(dictStr, langCode, comparator) &&
+          if (nsStyleUtil::DashMatchCompare(GetDictNameWithDash(dictStr), langCode, comparator) &&
               NS_SUCCEEDED(SetCurrentDictionary(dictStr))) {
               break;
           }
         }
       }
     }
   }
 
bgstack15