Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add events for spellcheck dictionary downloads #22449

Merged
merged 1 commit into from Mar 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
39 changes: 39 additions & 0 deletions docs/api/session.md
Expand Up @@ -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`:
Expand Down
1 change: 1 addition & 0 deletions patches/chromium/.patches
Expand Up @@ -89,3 +89,4 @@ feat_add_support_for_overriding_the_base_spellchecker_download_url.patch
feat_enable_offscreen_rendering_with_viz_compositor.patch
delay_lock_the_protocol_scheme_registry.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_;
25 changes: 25 additions & 0 deletions shell/browser/api/electron_api_session.cc
Expand Up @@ -279,11 +279,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.
Expand Down Expand Up @@ -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::Isolate* isolate = args->isolate();
gin_helper::Promise<std::string> promise(isolate);
Expand Down
12 changes: 11 additions & 1 deletion shell/browser/api/electron_api_session.h
Expand Up @@ -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 "gin/handle.h"
Expand Down Expand Up @@ -37,7 +38,8 @@ class ElectronBrowserContext;
namespace api {

class Session : public gin_helper::TrackableObject<Session>,
public content::DownloadManager::Observer {
public content::DownloadManager::Observer,
public SpellcheckHunspellDictionary::Observer {
public:
// Gets or creates Session from the |browser_context|.
static gin::Handle<Session> CreateFrom(
Expand Down Expand Up @@ -116,6 +118,14 @@ class Session : public gin_helper::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 gin_helper::Wrappable objects.
v8::Global<v8::Value> cookies_;
Expand Down