Browse Source

feat: add events for spellcheck dictionary downloads (#22449) (#22558)

Samuel Attard 5 years ago
parent
commit
6f12b67582

+ 39 - 0
docs/api/session.md

@@ -105,6 +105,45 @@ Returns:
 Emitted when a render process requests preconnection to a URL, generally due to
 a [resource hint](https://w3c.github.io/resource-hints/).
 
+#### Event: 'spellcheck-dictionary-initialized'
+
+Returns:
+
+* `event` Event
+* `languageCode` String - The language code of the dictionary file
+
+Emitted when a hunspell dictionary file has been successfully initialized. This
+occurs after the file has been downloaded.
+
+#### Event: 'spellcheck-dictionary-download-begin'
+
+Returns:
+
+* `event` Event
+* `languageCode` String - The language code of the dictionary file
+
+Emitted when a hunspell dictionary file starts downloading
+
+#### Event: 'spellcheck-dictionary-download-success'
+
+Returns:
+
+* `event` Event
+* `languageCode` String - The language code of the dictionary file
+
+Emitted when a hunspell dictionary file has been successfully downloaded
+
+#### Event: 'spellcheck-dictionary-download-failure'
+
+Returns:
+
+* `event` Event
+* `languageCode` String - The language code of the dictionary file
+
+Emitted when a hunspell dictionary file download fails.  For details
+on the failure you should collect a netlog and inspect the download
+request.
+
 ### Instance Methods
 
 The following methods are available on instances of `Session`:

+ 1 - 0
patches/chromium/.patches

@@ -89,3 +89,4 @@ port_aria_tree_fix_for_macos_voiceover.patch
 fix_route_mouse_event_navigations_through_the_web_contents_delegate.patch
 feat_add_support_for_overriding_the_base_spellchecker_download_url.patch
 os_metrics_mac.patch
+feat_allow_embedders_to_add_observers_on_created_hunspell.patch

+ 64 - 0
patches/chromium/feat_allow_embedders_to_add_observers_on_created_hunspell.patch

@@ -0,0 +1,64 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Samuel Attard <[email protected]>
+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 0dc509bafcfab2637aab4ea55769cd06ad3492c9..3b1f02e354c5c5a85e9193859ca8e7497f02cf86 100644
+--- a/chrome/browser/spellchecker/spellcheck_service.cc
++++ b/chrome/browser/spellchecker/spellcheck_service.cc
+@@ -284,6 +284,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();
+   }
+ 
+@@ -297,6 +300,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 557a0a2a91821a595181481f92b2a2a06dcb1f50..59e24da4be927303df8c4aac87f50778c1c208b0 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_;

+ 25 - 0
shell/browser/api/electron_api_session.cc

@@ -237,11 +237,23 @@ Session::Session(v8::Isolate* isolate, ElectronBrowserContext* browser_context)
 
   Init(isolate);
   AttachAsUserData(browser_context);
+
+  SpellcheckService* service =
+      SpellcheckServiceFactory::GetForContext(browser_context_.get());
+  if (service) {
+    service->SetHunspellObserver(this);
+  }
 }
 
 Session::~Session() {
   content::BrowserContext::GetDownloadManager(browser_context())
       ->RemoveObserver(this);
+
+  SpellcheckService* service =
+      SpellcheckServiceFactory::GetForContext(browser_context_.get());
+  if (service) {
+    service->SetHunspellObserver(nullptr);
+  }
   // TODO(zcbenz): Now since URLRequestContextGetter is gone, is this still
   // needed?
   // Refs https://github.com/electron/electron/pull/12305.
@@ -270,6 +282,19 @@ void Session::OnDownloadCreated(content::DownloadManager* manager,
   }
 }
 
+void Session::OnHunspellDictionaryInitialized(const std::string& language) {
+  Emit("spellcheck-dictionary-initialized", language);
+}
+void Session::OnHunspellDictionaryDownloadBegin(const std::string& language) {
+  Emit("spellcheck-dictionary-download-begin", language);
+}
+void Session::OnHunspellDictionaryDownloadSuccess(const std::string& language) {
+  Emit("spellcheck-dictionary-download-success", language);
+}
+void Session::OnHunspellDictionaryDownloadFailure(const std::string& language) {
+  Emit("spellcheck-dictionary-download-failure", language);
+}
+
 v8::Local<v8::Promise> Session::ResolveProxy(mate::Arguments* args) {
   v8::Isolate* isolate = args->isolate();
   util::Promise<std::string> promise(isolate);

+ 11 - 1
shell/browser/api/electron_api_session.h

@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/values.h"
+#include "chrome/browser/spellchecker/spellcheck_hunspell_dictionary.h"
 #include "content/public/browser/download_manager.h"
 #include "electron/buildflags/buildflags.h"
 #include "native_mate/handle.h"
@@ -38,7 +39,8 @@ class ElectronBrowserContext;
 namespace api {
 
 class Session : public mate::TrackableObject<Session>,
-                public content::DownloadManager::Observer {
+                public content::DownloadManager::Observer,
+                public SpellcheckHunspellDictionary::Observer {
  public:
   // Gets or creates Session from the |browser_context|.
   static mate::Handle<Session> CreateFrom(
@@ -109,6 +111,14 @@ class Session : public mate::TrackableObject<Session>,
   void OnDownloadCreated(content::DownloadManager* manager,
                          download::DownloadItem* item) override;
 
+  // SpellcheckHunspellDictionary::Observer
+  void OnHunspellDictionaryInitialized(const std::string& language) override;
+  void OnHunspellDictionaryDownloadBegin(const std::string& language) override;
+  void OnHunspellDictionaryDownloadSuccess(
+      const std::string& language) override;
+  void OnHunspellDictionaryDownloadFailure(
+      const std::string& language) override;
+
  private:
   // Cached mate::Wrappable objects.
   v8::Global<v8::Value> cookies_;