From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samuel Attard <sattard@slack-corp.com>
Date: Sun, 1 Mar 2020 16:33:55 -0800
Subject: feat: allow embedders to add observers on created hunspell
 dictionaries

diff --git a/chrome/browser/spellchecker/spellcheck_service.cc b/chrome/browser/spellchecker/spellcheck_service.cc
index 7d3ddb783ca82c88b1d2fd388b9e33e20f06b833..543c8026ead55e135b923ae99cb90f117f5d7f51 100644
--- a/chrome/browser/spellchecker/spellcheck_service.cc
+++ b/chrome/browser/spellchecker/spellcheck_service.cc
@@ -283,6 +283,9 @@ void SpellcheckService::LoadHunspellDictionaries() {
         std::make_unique<SpellcheckHunspellDictionary>(dictionary, context_,
                                                        this));
     hunspell_dictionaries_.back()->AddObserver(this);
+    if (hunspell_observer_) {
+      hunspell_dictionaries_.back()->AddObserver(hunspell_observer_);
+    }
     hunspell_dictionaries_.back()->Load();
   }
 
@@ -296,6 +299,20 @@ SpellcheckService::GetHunspellDictionaries() {
   return hunspell_dictionaries_;
 }
 
+void SpellcheckService::SetHunspellObserver(SpellcheckHunspellDictionary::Observer* observer) {
+  if (hunspell_observer_) {
+    for (auto& dict : hunspell_dictionaries_) {
+      dict->RemoveObserver(hunspell_observer_);
+    }
+  }
+  if (observer) {
+    for (auto& dict : hunspell_dictionaries_) {
+      dict->AddObserver(observer);
+    }
+  }
+  hunspell_observer_ = observer;
+}
+
 bool SpellcheckService::LoadExternalDictionary(std::string language,
                                                std::string locale,
                                                std::string path,
diff --git a/chrome/browser/spellchecker/spellcheck_service.h b/chrome/browser/spellchecker/spellcheck_service.h
index 803c7dad0d30af2c5ebd9b3e2f200183fa20d15a..5afca1e55685efea1f17dfba98db3ebd51c849de 100644
--- a/chrome/browser/spellchecker/spellcheck_service.h
+++ b/chrome/browser/spellchecker/spellcheck_service.h
@@ -116,6 +116,8 @@ class SpellcheckService : public KeyedService,
   const std::vector<std::unique_ptr<SpellcheckHunspellDictionary>>&
   GetHunspellDictionaries();
 
+  void SetHunspellObserver(SpellcheckHunspellDictionary::Observer* observer);
+
   // Load a dictionary from a given path. Format specifies how the dictionary
   // is stored. Return value is true if successful.
   bool LoadExternalDictionary(std::string language,
@@ -213,6 +215,8 @@ class SpellcheckService : public KeyedService,
   // A pointer to the BrowserContext which this service refers to.
   content::BrowserContext* context_;
 
+  SpellcheckHunspellDictionary::Observer* hunspell_observer_ = nullptr;
+
   std::unique_ptr<SpellCheckHostMetrics> metrics_;
 
   std::unique_ptr<SpellcheckCustomDictionary> custom_dictionary_;
