Backed out 1 changesets (bug 1193293) on developers requests
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Mon, 21 Sep 2015 14:00:43 +0200
changeset 263524 5da1fc351aba2e08f33983e9a011306dde4a81af
parent 263523 7cd926385096475bda3eb601e0ff109f45c0498a
child 263525 44e1b61e30b5a663409a9be6b2104650c8103c46
child 263559 fcef8ded82219c89298b4e376cfbdfba79a1d35a
child 263578 857d14f69fa30aa615795b0b3b36f72af6dce349
child 263583 1e9eb1e4c06b901a070fcf54ba47461bf1fa5ff7
push id65338
push usercbook@mozilla.com
push dateMon, 21 Sep 2015 12:03:40 +0000
treeherdermozilla-inbound@44e1b61e30b5 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1193293
milestone43.0a1
backs outc79d3947c307e5eddd13ae2bcb0c611dd201f94f
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 1 changesets (bug 1193293) on developers requests Backed out changeset c79d3947c307 (bug 1193293)
editor/composer/nsEditorSpellCheck.cpp
editor/libeditor/nsEditor.cpp
editor/nsIEditorSpellCheck.idl
--- a/editor/composer/nsEditorSpellCheck.cpp
+++ b/editor/composer/nsEditorSpellCheck.cpp
@@ -631,16 +631,44 @@ nsEditorSpellCheck::SetCurrentDictionary
              NS_ConvertUTF16toUTF8(aDictionary).get());
 #endif
     }
   }
   return mSpellChecker->SetCurrentDictionary(aDictionary);
 }
 
 NS_IMETHODIMP
+nsEditorSpellCheck::CheckCurrentDictionary()
+{
+  mSpellChecker->CheckCurrentDictionary();
+
+  // Check if our current dictionary is still available.
+  nsAutoString currentDictionary;
+  nsresult rv = GetCurrentDictionary(currentDictionary);
+  if (NS_SUCCEEDED(rv) && !currentDictionary.IsEmpty()) {
+    return NS_OK;
+  }
+
+  // If our preferred current dictionary has gone, pick another one.
+  nsTArray<nsString> dictList;
+  rv = mSpellChecker->GetDictionaryList(&dictList);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  if (dictList.Length() > 0) {
+    // Use RAII object to prevent content preferences being written during
+    // this call.
+    UpdateDictionaryHolder holder(this);
+    rv = SetCurrentDictionary(dictList[0]);
+    NS_ENSURE_SUCCESS(rv, rv);
+  }
+
+  return NS_OK;
+}
+
+NS_IMETHODIMP
 nsEditorSpellCheck::UninitSpellChecker()
 {
   NS_ENSURE_TRUE(mSpellChecker, NS_ERROR_NOT_INITIALIZED);
 
   // Cleanup - kill the spell checker
   DeleteSuggestedWordList();
   mDictionaryList.Clear();
   mDictionaryIndex = 0;
@@ -802,35 +830,27 @@ nsEditorSpellCheck::DictionaryFetched(Di
   if (mPreferredLang.IsEmpty()) {
     mPreferredLang.Assign(aFetcher->mRootDocContentLang);
 #ifdef DEBUG_DICT
     printf("***** mPreferredLang (content-language) |%s|\n",
            NS_ConvertUTF16toUTF8(mPreferredLang).get());
 #endif
   }
 
-  // Auxiliary status.
-  nsresult rv2;
-
-  // We obtain a list of available dictionaries.
-  nsTArray<nsString> dictList;
-  rv2 = mSpellChecker->GetDictionaryList(&dictList);
-  NS_ENSURE_SUCCESS(rv2, rv2);
-
   // Priority 1:
   // If we successfully fetched a dictionary from content prefs, do not go
   // further. Use this exact dictionary.
   // Don't use content preferences for editor with eEditorMailMask flag.
   nsAutoString dictName;
   uint32_t flags;
   mEditor->GetFlags(&flags);
   if (!(flags & nsIPlaintextEditor::eEditorMailMask)) {
     dictName.Assign(aFetcher->mDictionary);
     if (!dictName.IsEmpty()) {
-      if (NS_SUCCEEDED(TryDictionary(dictName, dictList, DICT_NORMAL_COMPARE))) {
+      if (NS_SUCCEEDED(SetCurrentDictionary(dictName))) {
 #ifdef DEBUG_DICT
         printf("***** Assigned from content preferences |%s|\n",
                NS_ConvertUTF16toUTF8(dictName).get());
 #endif
 
         // We take an early exit here, so let's not forget to clear the word
         // list.
         DeleteSuggestedWordList();
@@ -846,16 +866,24 @@ nsEditorSpellCheck::DictionaryFetched(Di
   // After checking the content preferences, we use the language of the element
   // or document.
   dictName.Assign(mPreferredLang);
 #ifdef DEBUG_DICT
   printf("***** Assigned from element/doc |%s|\n",
          NS_ConvertUTF16toUTF8(dictName).get());
 #endif
 
+  // Auxiliary status.
+  nsresult rv2;
+
+  // We obtain a list of available dictionaries.
+  nsTArray<nsString> dictList;
+  rv2 = mSpellChecker->GetDictionaryList(&dictList);
+  NS_ENSURE_SUCCESS(rv2, rv2);
+
   // Get the preference value.
   nsAutoString preferredDict;
   preferredDict = Preferences::GetLocalizedString("spellchecker.dictionary");
 
   // The following will be driven by this status. Once we were able to set a
   // dictionary successfully, we're done. So we start with a "failed" status.
   nsresult rv = NS_ERROR_NOT_AVAILABLE;
 
--- a/editor/libeditor/nsEditor.cpp
+++ b/editor/libeditor/nsEditor.cpp
@@ -1323,16 +1323,25 @@ NS_IMETHODIMP nsEditor::Observe(nsISuppo
                        SPELLCHECK_DICTIONARY_REMOVE_NOTIFICATION),
                "Unexpected observer topic");
 
   // When mozInlineSpellChecker::CanEnableInlineSpellChecking changes
   SyncRealTimeSpell();
 
   // When nsIEditorSpellCheck::GetCurrentDictionary changes
   if (mInlineSpellChecker) {
+    // if the current dictionary is no longer available, find another one
+    nsCOMPtr<nsIEditorSpellCheck> editorSpellCheck;
+    mInlineSpellChecker->GetSpellChecker(getter_AddRefs(editorSpellCheck));
+    if (editorSpellCheck) {
+      // Note: This might change the current dictionary, which may call
+      // this observer recursively.
+      editorSpellCheck->CheckCurrentDictionary();
+    }
+
     // update the inline spell checker to reflect the new current dictionary
     mInlineSpellChecker->SpellCheckRange(nullptr); // causes recheck
   }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP nsEditor::SyncRealTimeSpell()
--- a/editor/nsIEditorSpellCheck.idl
+++ b/editor/nsIEditorSpellCheck.idl
@@ -4,20 +4,27 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsISupports.idl"
 
 interface nsIEditor;
 interface nsITextServicesFilter;
 interface nsIEditorSpellCheckCallback;
 
-[scriptable, uuid(c9e630b8-79fd-4546-b068-be1b2a84c347)]
+[scriptable, uuid(dd32ef3b-a7d8-43d1-9617-5f2dddbe29eb)]
 interface nsIEditorSpellCheck : nsISupports
 {
 
+  /**
+   * Call this on any change in installed dictionaries to ensure that the spell
+   * checker is not using a current dictionary which is no longer available.
+   * If the current dictionary is no longer available, then pick another one.
+   */
+  void checkCurrentDictionary();
+
  /**
    * Returns true if we can enable spellchecking. If there are no available
    * dictionaries, this will return false.
    */
   boolean       canSpellCheck();
 
   /**
    * Turns on the spell checker for the given editor. enableSelectionChecking