| Index: chrome/browser/renderer_host/browser_render_process_host.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/renderer_host/browser_render_process_host.cc	(revision 31117)
 | 
| +++ chrome/browser/renderer_host/browser_render_process_host.cc	(working copy)
 | 
| @@ -40,6 +40,9 @@
 | 
|  #include "chrome/browser/renderer_host/render_widget_host.h"
 | 
|  #include "chrome/browser/renderer_host/resource_message_filter.h"
 | 
|  #include "chrome/browser/renderer_host/web_cache_manager.h"
 | 
| +#if defined(SPELLCHECKER_IN_RENDERER)
 | 
| +#include "chrome/browser/spellcheck_host.h"
 | 
| +#endif
 | 
|  #include "chrome/browser/spellchecker.h"
 | 
|  #include "chrome/browser/visitedlink_master.h"
 | 
|  #include "chrome/common/chrome_switches.h"
 | 
| @@ -203,6 +206,16 @@
 | 
|  
 | 
|    registrar_.Add(this, NotificationType::USER_SCRIPTS_UPDATED,
 | 
|                   NotificationService::AllSources());
 | 
| +#if defined(SPELLCHECKER_IN_RENDERER)
 | 
| +  registrar_.Add(this, NotificationType::SPELLCHECK_HOST_REINITIALIZED,
 | 
| +                 NotificationService::AllSources());
 | 
| +  registrar_.Add(this, NotificationType::SPELLCHECK_WORD_ADDED,
 | 
| +                 NotificationService::AllSources());
 | 
| +
 | 
| +  PrefService* prefs = profile->GetPrefs();
 | 
| +  prefs->AddPrefObserver(prefs::kEnableAutoSpellCorrect, this);
 | 
| +#endif
 | 
| +
 | 
|    visited_link_updater_.reset(new VisitedLinkUpdater());
 | 
|  
 | 
|    WebCacheManager::GetInstance()->Add(id());
 | 
| @@ -215,6 +228,11 @@
 | 
|  }
 | 
|  
 | 
|  BrowserRenderProcessHost::~BrowserRenderProcessHost() {
 | 
| +#if defined(SPELLCHECKER_IN_RENDERER)
 | 
| +  PrefService* prefs = profile()->GetPrefs();
 | 
| +  prefs->RemovePrefObserver(prefs::kEnableAutoSpellCorrect, this);
 | 
| +#endif
 | 
| +
 | 
|    WebCacheManager::GetInstance()->Remove(id());
 | 
|    ChildProcessSecurityPolicy::GetInstance()->Remove(id());
 | 
|  
 | 
| @@ -348,6 +366,14 @@
 | 
|    InitVisitedLinks();
 | 
|    InitUserScripts();
 | 
|    InitExtensions();
 | 
| +#if defined(SPELLCHECKER_IN_RENDERER)
 | 
| +  // We don't want to initialize the spellchecker unless SpellCheckHost has been
 | 
| +  // created. In InitSpellChecker(), we know if GetSpellCheckHost() is NULL
 | 
| +  // then the spellchecker has been turned off, but here, we don't know if
 | 
| +  // it's been turned off or just not loaded yet.
 | 
| +  if (profile()->GetSpellCheckHost())
 | 
| +    InitSpellChecker();
 | 
| +#endif
 | 
|  
 | 
|    if (max_page_id_ != -1)
 | 
|      channel_->Send(new ViewMsg_SetNextPageID(max_page_id_ + 1));
 | 
| @@ -813,6 +839,10 @@
 | 
|                            OnExtensionRemoveListener)
 | 
|        IPC_MESSAGE_HANDLER(ViewHostMsg_ExtensionCloseChannel,
 | 
|                            OnExtensionCloseChannel)
 | 
| +#if defined(SPELLCHECKER_IN_RENDERER)
 | 
| +      IPC_MESSAGE_HANDLER(ViewHostMsg_SpellChecker_RequestDictionary,
 | 
| +                          OnSpellCheckerRequestDictionary)
 | 
| +#endif
 | 
|        IPC_MESSAGE_UNHANDLED_ERROR()
 | 
|      IPC_END_MESSAGE_MAP_EX()
 | 
|  
 | 
| @@ -1019,6 +1049,29 @@
 | 
|        }
 | 
|        break;
 | 
|      }
 | 
| +#if defined(SPELLCHECKER_IN_RENDERER)
 | 
| +    case NotificationType::SPELLCHECK_HOST_REINITIALIZED: {
 | 
| +      InitSpellChecker();
 | 
| +      break;
 | 
| +    }
 | 
| +    case NotificationType::SPELLCHECK_WORD_ADDED: {
 | 
| +      AddSpellCheckWord(
 | 
| +          reinterpret_cast<const Source<SpellCheckHost>*>(&source)->
 | 
| +          ptr()->last_added_word());
 | 
| +      break;
 | 
| +    }
 | 
| +    case NotificationType::PREF_CHANGED: {
 | 
| +      std::wstring* pref_name_in = Details<std::wstring>(details).ptr();
 | 
| +      PrefService* prefs = Source<PrefService>(source).ptr();
 | 
| +      DCHECK(pref_name_in && prefs);
 | 
| +      if (*pref_name_in == prefs::kEnableAutoSpellCorrect) {
 | 
| +        EnableAutoSpellCorrect(
 | 
| +            prefs->GetBoolean(prefs::kEnableAutoSpellCorrect));
 | 
| +        break;
 | 
| +      }
 | 
| +      // Fall through.
 | 
| +    }
 | 
| +#endif
 | 
|      default: {
 | 
|        NOTREACHED();
 | 
|        break;
 | 
| @@ -1047,3 +1100,34 @@
 | 
|      profile()->GetExtensionMessageService()->CloseChannel(port_id);
 | 
|    }
 | 
|  }
 | 
| +
 | 
| +#if defined(SPELLCHECKER_IN_RENDERER)
 | 
| +void BrowserRenderProcessHost::OnSpellCheckerRequestDictionary() {
 | 
| +  // We may have gotten multiple requests from different renderers. We don't
 | 
| +  // want to initialize multiple times in this case, so we set |force| to false.
 | 
| +  profile()->ReinitializeSpellCheckHost(false);
 | 
| +}
 | 
| +
 | 
| +void BrowserRenderProcessHost::AddSpellCheckWord(const std::string& word) {
 | 
| +  channel_->Send(new ViewMsg_SpellChecker_WordAdded(word));
 | 
| +}
 | 
| +
 | 
| +void BrowserRenderProcessHost::InitSpellChecker() {
 | 
| +  SpellCheckHost* spellcheck_host = profile()->GetSpellCheckHost();
 | 
| +  if (spellcheck_host) {
 | 
| +    PrefService* prefs = profile()->GetPrefs();
 | 
| +    channel_->Send(new ViewMsg_SpellChecker_Init(
 | 
| +        spellcheck_host->bdict_fd(), spellcheck_host->custom_words(),
 | 
| +        spellcheck_host->language(),
 | 
| +        prefs->GetBoolean(prefs::kEnableAutoSpellCorrect)));
 | 
| +  } else {
 | 
| +    channel_->Send(new ViewMsg_SpellChecker_Init(
 | 
| +        base::FileDescriptor(), std::vector<std::string>(), std::string(),
 | 
| +        false));
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void BrowserRenderProcessHost::EnableAutoSpellCorrect(bool enable) {
 | 
| +  channel_->Send(new ViewMsg_SpellChecker_EnableAutoSpellCorrect(enable));
 | 
| +}
 | 
| +#endif
 | 
| 
 |