Index: chrome/browser/profile.cc |
=================================================================== |
--- chrome/browser/profile.cc (revision 31117) |
+++ chrome/browser/profile.cc (working copy) |
@@ -478,6 +478,16 @@ |
profile_->DeleteSpellChecker(); |
} |
+#if defined(SPELLCHECKER_IN_RENDERER) |
+ virtual SpellCheckHost* GetSpellCheckHost() { |
+ return profile_->GetSpellCheckHost(); |
+ } |
+ |
+ virtual void ReinitializeSpellCheckHost(bool force) { |
+ profile_->ReinitializeSpellCheckHost(force); |
+ } |
+#endif |
+ |
virtual WebKitContext* GetWebKitContext() { |
if (!webkit_context_.get()) |
webkit_context_ = new WebKitContext(GetPath(), true); |
@@ -569,6 +579,10 @@ |
created_theme_provider_(false), |
start_time_(Time::Now()), |
spellchecker_(NULL), |
+#if defined(OS_LINUX) |
+ spellcheck_host_(NULL), |
+ spellcheck_host_ready_(false), |
+#endif |
shutdown_session_service_(false) { |
DCHECK(!path.empty()) << "Using an empty path will attempt to write " << |
"profile files to the root directory!"; |
@@ -740,6 +754,10 @@ |
if (history_service_.get()) |
history_service_->Cleanup(); |
+#if defined(SPELLCHECKER_IN_RENDERER) |
+ if (spellcheck_host_.get()) |
+ spellcheck_host_->UnsetObserver(); |
+#endif |
DeleteSpellCheckerImpl(false); |
if (default_request_context_ == request_context_) { |
@@ -1260,6 +1278,47 @@ |
} |
} |
+#if defined(SPELLCHECKER_IN_RENDERER) |
+SpellCheckHost* ProfileImpl::GetSpellCheckHost() { |
+ return spellcheck_host_ready_ ? spellcheck_host_.get() : NULL; |
+} |
+ |
+void ProfileImpl::ReinitializeSpellCheckHost(bool force) { |
+ // If we are already loading the spellchecker, and this is just a hint to |
+ // load the spellchecker, do nothing. |
+ if (!force && spellcheck_host_.get()) |
+ return; |
+ |
+ bool notify = false; |
+ if (spellcheck_host_.get()) { |
+ spellcheck_host_->UnsetObserver(); |
+ spellcheck_host_.release(); |
+ spellcheck_host_ready_ = false; |
+ notify = true; |
+ } |
+ |
+ PrefService* prefs = GetPrefs(); |
+ if (prefs->GetBoolean(prefs::kEnableSpellCheck)) { |
+ // Retrieve the (perhaps updated recently) dictionary name from preferences. |
+ spellcheck_host_ = new SpellCheckHost(this, |
+ WideToASCII(prefs->GetString(prefs::kSpellCheckDictionary)), |
+ GetRequestContext()); |
+ spellcheck_host_->AddRef(); |
+ } else if (notify) { |
+ // The spellchecker has been disabled. |
+ SpellCheckHostInitialized(); |
+ } |
+} |
+ |
+void ProfileImpl::SpellCheckHostInitialized() { |
+ spellcheck_host_ready_ = |
+ spellcheck_host_ && spellcheck_host_->bdict_fd().fd != -1; |
+ NotificationService::current()->Notify( |
+ NotificationType::SPELLCHECK_HOST_REINITIALIZED, |
+ Source<Profile>(this), NotificationService::NoDetails()); |
+} |
+#endif |
+ |
void ProfileImpl::NotifySpellCheckerChanged() { |
SpellcheckerReinitializedDetails scoped_spellchecker; |
scoped_spellchecker.spellchecker = spellchecker_; |
@@ -1328,9 +1387,14 @@ |
PrefService* prefs = Source<PrefService>(source).ptr(); |
DCHECK(pref_name_in && prefs); |
if (*pref_name_in == prefs::kSpellCheckDictionary || |
- *pref_name_in == prefs::kEnableSpellCheck || |
- *pref_name_in == prefs::kEnableAutoSpellCorrect) { |
+#if !defined(SPELLCHECKER_IN_RENDERER) |
+ *pref_name_in == prefs::kEnableAutoSpellCorrect || |
+#endif |
+ *pref_name_in == prefs::kEnableSpellCheck) { |
ReinitializeSpellChecker(); |
+#if defined(SPELLCHECKER_IN_RENDERER) |
+ ReinitializeSpellCheckHost(true); |
+#endif |
} |
} else if (NotificationType::THEME_INSTALLED == type) { |
Extension* extension = Details<Extension>(details).ptr(); |