feat: add events for spellcheck dictionary downloads (#22449)
This commit is contained in:
		
					parent
					
						
							
								e9132afa98
							
						
					
				
			
			
				commit
				
					
						b3e1134a1a
					
				
			
		
					 5 changed files with 140 additions and 1 deletions
				
			
		|  | @ -105,6 +105,45 @@ Returns: | ||||||
| Emitted when a render process requests preconnection to a URL, generally due to | Emitted when a render process requests preconnection to a URL, generally due to | ||||||
| a [resource hint](https://w3c.github.io/resource-hints/). | 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 | ### Instance Methods | ||||||
| 
 | 
 | ||||||
| The following methods are available on instances of `Session`: | The following methods are available on instances of `Session`: | ||||||
|  |  | ||||||
|  | @ -89,3 +89,4 @@ feat_add_support_for_overriding_the_base_spellchecker_download_url.patch | ||||||
| feat_enable_offscreen_rendering_with_viz_compositor.patch | feat_enable_offscreen_rendering_with_viz_compositor.patch | ||||||
| delay_lock_the_protocol_scheme_registry.patch | delay_lock_the_protocol_scheme_registry.patch | ||||||
| gpu_notify_when_dxdiag_request_fails.patch | gpu_notify_when_dxdiag_request_fails.patch | ||||||
|  | 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 <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 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_; | ||||||
|  | @ -279,11 +279,23 @@ Session::Session(v8::Isolate* isolate, ElectronBrowserContext* browser_context) | ||||||
| 
 | 
 | ||||||
|   Init(isolate); |   Init(isolate); | ||||||
|   AttachAsUserData(browser_context); |   AttachAsUserData(browser_context); | ||||||
|  | 
 | ||||||
|  |   SpellcheckService* service = | ||||||
|  |       SpellcheckServiceFactory::GetForContext(browser_context_.get()); | ||||||
|  |   if (service) { | ||||||
|  |     service->SetHunspellObserver(this); | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Session::~Session() { | Session::~Session() { | ||||||
|   content::BrowserContext::GetDownloadManager(browser_context()) |   content::BrowserContext::GetDownloadManager(browser_context()) | ||||||
|       ->RemoveObserver(this); |       ->RemoveObserver(this); | ||||||
|  | 
 | ||||||
|  |   SpellcheckService* service = | ||||||
|  |       SpellcheckServiceFactory::GetForContext(browser_context_.get()); | ||||||
|  |   if (service) { | ||||||
|  |     service->SetHunspellObserver(nullptr); | ||||||
|  |   } | ||||||
|   // TODO(zcbenz): Now since URLRequestContextGetter is gone, is this still
 |   // TODO(zcbenz): Now since URLRequestContextGetter is gone, is this still
 | ||||||
|   // needed?
 |   // needed?
 | ||||||
|   // Refs https://github.com/electron/electron/pull/12305.
 |   // Refs https://github.com/electron/electron/pull/12305.
 | ||||||
|  | @ -312,6 +324,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(gin_helper::Arguments* args) { | v8::Local<v8::Promise> Session::ResolveProxy(gin_helper::Arguments* args) { | ||||||
|   v8::Isolate* isolate = args->isolate(); |   v8::Isolate* isolate = args->isolate(); | ||||||
|   gin_helper::Promise<std::string> promise(isolate); |   gin_helper::Promise<std::string> promise(isolate); | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ | ||||||
| #include <vector> | #include <vector> | ||||||
| 
 | 
 | ||||||
| #include "base/values.h" | #include "base/values.h" | ||||||
|  | #include "chrome/browser/spellchecker/spellcheck_hunspell_dictionary.h" | ||||||
| #include "content/public/browser/download_manager.h" | #include "content/public/browser/download_manager.h" | ||||||
| #include "electron/buildflags/buildflags.h" | #include "electron/buildflags/buildflags.h" | ||||||
| #include "gin/handle.h" | #include "gin/handle.h" | ||||||
|  | @ -37,7 +38,8 @@ class ElectronBrowserContext; | ||||||
| namespace api { | namespace api { | ||||||
| 
 | 
 | ||||||
| class Session : public gin_helper::TrackableObject<Session>, | class Session : public gin_helper::TrackableObject<Session>, | ||||||
|                 public content::DownloadManager::Observer { |                 public content::DownloadManager::Observer, | ||||||
|  |                 public SpellcheckHunspellDictionary::Observer { | ||||||
|  public: |  public: | ||||||
|   // Gets or creates Session from the |browser_context|.
 |   // Gets or creates Session from the |browser_context|.
 | ||||||
|   static gin::Handle<Session> CreateFrom( |   static gin::Handle<Session> CreateFrom( | ||||||
|  | @ -116,6 +118,14 @@ class Session : public gin_helper::TrackableObject<Session>, | ||||||
|   void OnDownloadCreated(content::DownloadManager* manager, |   void OnDownloadCreated(content::DownloadManager* manager, | ||||||
|                          download::DownloadItem* item) override; |                          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: |  private: | ||||||
|   // Cached gin_helper::Wrappable objects.
 |   // Cached gin_helper::Wrappable objects.
 | ||||||
|   v8::Global<v8::Value> cookies_; |   v8::Global<v8::Value> cookies_; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Samuel Attard
				Samuel Attard