| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Represents the browser side of the browser <--> renderer communication | 5 // Represents the browser side of the browser <--> renderer communication |
| 6 // channel. There will be one RenderProcessHost per renderer process. | 6 // channel. There will be one RenderProcessHost per renderer process. |
| 7 | 7 |
| 8 #include "chrome/browser/renderer_host/browser_render_process_host.h" | 8 #include "chrome/browser/renderer_host/browser_render_process_host.h" |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #include "chrome/browser/net/url_request_context_getter.h" | 33 #include "chrome/browser/net/url_request_context_getter.h" |
| 34 #include "chrome/browser/plugin_service.h" | 34 #include "chrome/browser/plugin_service.h" |
| 35 #include "chrome/browser/profile.h" | 35 #include "chrome/browser/profile.h" |
| 36 #include "chrome/browser/renderer_host/audio_renderer_host.h" | 36 #include "chrome/browser/renderer_host/audio_renderer_host.h" |
| 37 #include "chrome/browser/renderer_host/render_view_host.h" | 37 #include "chrome/browser/renderer_host/render_view_host.h" |
| 38 #include "chrome/browser/renderer_host/render_view_host_delegate.h" | 38 #include "chrome/browser/renderer_host/render_view_host_delegate.h" |
| 39 #include "chrome/browser/renderer_host/render_widget_helper.h" | 39 #include "chrome/browser/renderer_host/render_widget_helper.h" |
| 40 #include "chrome/browser/renderer_host/render_widget_host.h" | 40 #include "chrome/browser/renderer_host/render_widget_host.h" |
| 41 #include "chrome/browser/renderer_host/resource_message_filter.h" | 41 #include "chrome/browser/renderer_host/resource_message_filter.h" |
| 42 #include "chrome/browser/renderer_host/web_cache_manager.h" | 42 #include "chrome/browser/renderer_host/web_cache_manager.h" |
| 43 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 44 #include "chrome/browser/spellcheck_host.h" | 43 #include "chrome/browser/spellcheck_host.h" |
| 45 #endif | |
| 46 #include "chrome/browser/spellchecker.h" | |
| 47 #include "chrome/browser/visitedlink_master.h" | 44 #include "chrome/browser/visitedlink_master.h" |
| 48 #include "chrome/common/chrome_switches.h" | 45 #include "chrome/common/chrome_switches.h" |
| 49 #include "chrome/common/child_process_info.h" | 46 #include "chrome/common/child_process_info.h" |
| 50 #include "chrome/common/child_process_host.h" | 47 #include "chrome/common/child_process_host.h" |
| 51 #include "chrome/common/logging_chrome.h" | 48 #include "chrome/common/logging_chrome.h" |
| 52 #include "chrome/common/notification_service.h" | 49 #include "chrome/common/notification_service.h" |
| 50 #include "chrome/common/pref_names.h" |
| 51 #include "chrome/common/process_watcher.h" |
| 53 #include "chrome/common/render_messages.h" | 52 #include "chrome/common/render_messages.h" |
| 54 #include "chrome/common/result_codes.h" | 53 #include "chrome/common/result_codes.h" |
| 55 #include "chrome/renderer/render_process.h" | 54 #include "chrome/renderer/render_process.h" |
| 56 #include "chrome/renderer/render_thread.h" | 55 #include "chrome/renderer/render_thread.h" |
| 57 #include "grit/generated_resources.h" | 56 #include "grit/generated_resources.h" |
| 58 #include "ipc/ipc_logging.h" | 57 #include "ipc/ipc_logging.h" |
| 59 #include "ipc/ipc_message.h" | 58 #include "ipc/ipc_message.h" |
| 60 #include "ipc/ipc_platform_file.h" | 59 #include "ipc/ipc_platform_file.h" |
| 61 #include "ipc/ipc_switches.h" | 60 #include "ipc/ipc_switches.h" |
| 62 | 61 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 visible_widgets_(0), | 191 visible_widgets_(0), |
| 193 backgrounded_(true), | 192 backgrounded_(true), |
| 194 ALLOW_THIS_IN_INITIALIZER_LIST(cached_dibs_cleaner_( | 193 ALLOW_THIS_IN_INITIALIZER_LIST(cached_dibs_cleaner_( |
| 195 base::TimeDelta::FromSeconds(5), | 194 base::TimeDelta::FromSeconds(5), |
| 196 this, &BrowserRenderProcessHost::ClearTransportDIBCache)), | 195 this, &BrowserRenderProcessHost::ClearTransportDIBCache)), |
| 197 extension_process_(false) { | 196 extension_process_(false) { |
| 198 widget_helper_ = new RenderWidgetHelper(); | 197 widget_helper_ = new RenderWidgetHelper(); |
| 199 | 198 |
| 200 registrar_.Add(this, NotificationType::USER_SCRIPTS_UPDATED, | 199 registrar_.Add(this, NotificationType::USER_SCRIPTS_UPDATED, |
| 201 NotificationService::AllSources()); | 200 NotificationService::AllSources()); |
| 202 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 203 registrar_.Add(this, NotificationType::SPELLCHECK_HOST_REINITIALIZED, | 201 registrar_.Add(this, NotificationType::SPELLCHECK_HOST_REINITIALIZED, |
| 204 NotificationService::AllSources()); | 202 NotificationService::AllSources()); |
| 205 registrar_.Add(this, NotificationType::SPELLCHECK_WORD_ADDED, | 203 registrar_.Add(this, NotificationType::SPELLCHECK_WORD_ADDED, |
| 206 NotificationService::AllSources()); | 204 NotificationService::AllSources()); |
| 207 | 205 registrar_.Add(this, NotificationType::SPELLCHECK_AUTOSPELL_TOGGLED, |
| 208 PrefService* prefs = profile->GetPrefs(); | 206 NotificationService::AllSources()); |
| 209 prefs->AddPrefObserver(prefs::kEnableAutoSpellCorrect, this); | |
| 210 #endif | |
| 211 | 207 |
| 212 visited_link_updater_.reset(new VisitedLinkUpdater()); | 208 visited_link_updater_.reset(new VisitedLinkUpdater()); |
| 213 | 209 |
| 214 WebCacheManager::GetInstance()->Add(id()); | 210 WebCacheManager::GetInstance()->Add(id()); |
| 215 ChildProcessSecurityPolicy::GetInstance()->Add(id()); | 211 ChildProcessSecurityPolicy::GetInstance()->Add(id()); |
| 216 | 212 |
| 217 // Note: When we create the BrowserRenderProcessHost, it's technically | 213 // Note: When we create the BrowserRenderProcessHost, it's technically |
| 218 // backgrounded, because it has no visible listeners. But the process | 214 // backgrounded, because it has no visible listeners. But the process |
| 219 // doesn't actually exist yet, so we'll Background it later, after | 215 // doesn't actually exist yet, so we'll Background it later, after |
| 220 // creation. | 216 // creation. |
| 221 } | 217 } |
| 222 | 218 |
| 223 BrowserRenderProcessHost::~BrowserRenderProcessHost() { | 219 BrowserRenderProcessHost::~BrowserRenderProcessHost() { |
| 224 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 225 PrefService* prefs = profile()->GetPrefs(); | |
| 226 prefs->RemovePrefObserver(prefs::kEnableAutoSpellCorrect, this); | |
| 227 #endif | |
| 228 | |
| 229 WebCacheManager::GetInstance()->Remove(id()); | 220 WebCacheManager::GetInstance()->Remove(id()); |
| 230 ChildProcessSecurityPolicy::GetInstance()->Remove(id()); | 221 ChildProcessSecurityPolicy::GetInstance()->Remove(id()); |
| 231 | 222 |
| 232 // We may have some unsent messages at this point, but that's OK. | 223 // We may have some unsent messages at this point, but that's OK. |
| 233 channel_.reset(); | 224 channel_.reset(); |
| 234 while (!queued_messages_.empty()) { | 225 while (!queued_messages_.empty()) { |
| 235 delete queued_messages_.front(); | 226 delete queued_messages_.front(); |
| 236 queued_messages_.pop(); | 227 queued_messages_.pop(); |
| 237 } | 228 } |
| 238 | 229 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 audio_renderer_host_ = new AudioRendererHost(); | 261 audio_renderer_host_ = new AudioRendererHost(); |
| 271 | 262 |
| 272 scoped_refptr<ResourceMessageFilter> resource_message_filter = | 263 scoped_refptr<ResourceMessageFilter> resource_message_filter = |
| 273 new ResourceMessageFilter(g_browser_process->resource_dispatcher_host(), | 264 new ResourceMessageFilter(g_browser_process->resource_dispatcher_host(), |
| 274 id(), | 265 id(), |
| 275 audio_renderer_host_.get(), | 266 audio_renderer_host_.get(), |
| 276 PluginService::GetInstance(), | 267 PluginService::GetInstance(), |
| 277 g_browser_process->print_job_manager(), | 268 g_browser_process->print_job_manager(), |
| 278 profile(), | 269 profile(), |
| 279 widget_helper_, | 270 widget_helper_, |
| 280 profile()->GetSpellChecker(), | |
| 281 request_context); | 271 request_context); |
| 282 | 272 |
| 283 // Find the renderer before creating the channel so if this fails early we | 273 // Find the renderer before creating the channel so if this fails early we |
| 284 // return without creating the channel. | 274 // return without creating the channel. |
| 285 FilePath renderer_path = ChildProcessHost::GetChildPath(); | 275 FilePath renderer_path = ChildProcessHost::GetChildPath(); |
| 286 if (renderer_path.empty()) | 276 if (renderer_path.empty()) |
| 287 return false; | 277 return false; |
| 288 | 278 |
| 289 // Setup the IPC channel. | 279 // Setup the IPC channel. |
| 290 const std::string channel_id = | 280 const std::string channel_id = |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 | 377 |
| 388 DCHECK_EQ(backgrounded_, (visible_widgets_ == 0)); | 378 DCHECK_EQ(backgrounded_, (visible_widgets_ == 0)); |
| 389 visible_widgets_--; | 379 visible_widgets_--; |
| 390 DCHECK_GE(visible_widgets_, 0); | 380 DCHECK_GE(visible_widgets_, 0); |
| 391 if (visible_widgets_ == 0) { | 381 if (visible_widgets_ == 0) { |
| 392 DCHECK(!backgrounded_); | 382 DCHECK(!backgrounded_); |
| 393 SetBackgrounded(true); | 383 SetBackgrounded(true); |
| 394 } | 384 } |
| 395 } | 385 } |
| 396 | 386 |
| 397 void BrowserRenderProcessHost::AddWord(const string16& word) { | |
| 398 SpellChecker* spellchecker = profile()->GetSpellChecker(); | |
| 399 if (spellchecker) { | |
| 400 ChromeThread::PostTask( | |
| 401 ChromeThread::IO, FROM_HERE, | |
| 402 NewRunnableMethod(spellchecker, &SpellChecker::AddWord, word)); | |
| 403 } | |
| 404 } | |
| 405 | |
| 406 void BrowserRenderProcessHost::SendVisitedLinkTable( | 387 void BrowserRenderProcessHost::SendVisitedLinkTable( |
| 407 base::SharedMemory* table_memory) { | 388 base::SharedMemory* table_memory) { |
| 408 // Check if the process is still starting and we don't have a handle for it | 389 // Check if the process is still starting and we don't have a handle for it |
| 409 // yet, in which case this will happen later when InitVisitedLinks is called. | 390 // yet, in which case this will happen later when InitVisitedLinks is called. |
| 410 if (!run_renderer_in_process() && | 391 if (!run_renderer_in_process() && |
| 411 (!child_process_.get() || child_process_->IsStarting())) { | 392 (!child_process_.get() || child_process_->IsStarting())) { |
| 412 return; | 393 return; |
| 413 } | 394 } |
| 414 | 395 |
| 415 base::SharedMemoryHandle handle_for_process; | 396 base::SharedMemoryHandle handle_for_process; |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdatedCacheStats, | 736 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdatedCacheStats, |
| 756 OnUpdatedCacheStats) | 737 OnUpdatedCacheStats) |
| 757 IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged, | 738 IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged, |
| 758 SuddenTerminationChanged); | 739 SuddenTerminationChanged); |
| 759 IPC_MESSAGE_HANDLER(ViewHostMsg_ExtensionAddListener, | 740 IPC_MESSAGE_HANDLER(ViewHostMsg_ExtensionAddListener, |
| 760 OnExtensionAddListener) | 741 OnExtensionAddListener) |
| 761 IPC_MESSAGE_HANDLER(ViewHostMsg_ExtensionRemoveListener, | 742 IPC_MESSAGE_HANDLER(ViewHostMsg_ExtensionRemoveListener, |
| 762 OnExtensionRemoveListener) | 743 OnExtensionRemoveListener) |
| 763 IPC_MESSAGE_HANDLER(ViewHostMsg_ExtensionCloseChannel, | 744 IPC_MESSAGE_HANDLER(ViewHostMsg_ExtensionCloseChannel, |
| 764 OnExtensionCloseChannel) | 745 OnExtensionCloseChannel) |
| 765 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 766 IPC_MESSAGE_HANDLER(ViewHostMsg_SpellChecker_RequestDictionary, | 746 IPC_MESSAGE_HANDLER(ViewHostMsg_SpellChecker_RequestDictionary, |
| 767 OnSpellCheckerRequestDictionary) | 747 OnSpellCheckerRequestDictionary) |
| 768 #endif | |
| 769 IPC_MESSAGE_UNHANDLED_ERROR() | 748 IPC_MESSAGE_UNHANDLED_ERROR() |
| 770 IPC_END_MESSAGE_MAP_EX() | 749 IPC_END_MESSAGE_MAP_EX() |
| 771 | 750 |
| 772 if (!msg_is_ok) { | 751 if (!msg_is_ok) { |
| 773 // The message had a handler, but its de-serialization failed. | 752 // The message had a handler, but its de-serialization failed. |
| 774 // We consider this a capital crime. Kill the renderer if we have one. | 753 // We consider this a capital crime. Kill the renderer if we have one. |
| 775 ReceivedBadMessage(msg.type()); | 754 ReceivedBadMessage(msg.type()); |
| 776 } | 755 } |
| 777 return; | 756 return; |
| 778 } | 757 } |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 const NotificationDetails& details) { | 872 const NotificationDetails& details) { |
| 894 switch (type.value) { | 873 switch (type.value) { |
| 895 case NotificationType::USER_SCRIPTS_UPDATED: { | 874 case NotificationType::USER_SCRIPTS_UPDATED: { |
| 896 base::SharedMemory* shared_memory = | 875 base::SharedMemory* shared_memory = |
| 897 Details<base::SharedMemory>(details).ptr(); | 876 Details<base::SharedMemory>(details).ptr(); |
| 898 if (shared_memory) { | 877 if (shared_memory) { |
| 899 SendUserScriptsUpdate(shared_memory); | 878 SendUserScriptsUpdate(shared_memory); |
| 900 } | 879 } |
| 901 break; | 880 break; |
| 902 } | 881 } |
| 903 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 904 case NotificationType::SPELLCHECK_HOST_REINITIALIZED: { | 882 case NotificationType::SPELLCHECK_HOST_REINITIALIZED: { |
| 905 InitSpellChecker(); | 883 InitSpellChecker(); |
| 906 break; | 884 break; |
| 907 } | 885 } |
| 908 case NotificationType::SPELLCHECK_WORD_ADDED: { | 886 case NotificationType::SPELLCHECK_WORD_ADDED: { |
| 909 AddSpellCheckWord( | 887 AddSpellCheckWord( |
| 910 reinterpret_cast<const Source<SpellCheckHost>*>(&source)-> | 888 reinterpret_cast<const Source<SpellCheckHost>*>(&source)-> |
| 911 ptr()->last_added_word()); | 889 ptr()->last_added_word()); |
| 912 break; | 890 break; |
| 913 } | 891 } |
| 914 case NotificationType::PREF_CHANGED: { | 892 case NotificationType::SPELLCHECK_AUTOSPELL_TOGGLED: { |
| 915 std::wstring* pref_name_in = Details<std::wstring>(details).ptr(); | 893 PrefService* prefs = profile()->GetPrefs(); |
| 916 PrefService* prefs = Source<PrefService>(source).ptr(); | 894 EnableAutoSpellCorrect( |
| 917 DCHECK(pref_name_in && prefs); | 895 prefs->GetBoolean(prefs::kEnableAutoSpellCorrect)); |
| 918 if (*pref_name_in == prefs::kEnableAutoSpellCorrect) { | 896 break; |
| 919 EnableAutoSpellCorrect( | |
| 920 prefs->GetBoolean(prefs::kEnableAutoSpellCorrect)); | |
| 921 break; | |
| 922 } | |
| 923 // Fall through. | |
| 924 } | 897 } |
| 925 #endif | |
| 926 default: { | 898 default: { |
| 927 NOTREACHED(); | 899 NOTREACHED(); |
| 928 break; | 900 break; |
| 929 } | 901 } |
| 930 } | 902 } |
| 931 } | 903 } |
| 932 | 904 |
| 933 void BrowserRenderProcessHost::OnProcessLaunched() { | 905 void BrowserRenderProcessHost::OnProcessLaunched() { |
| 934 // Now that the process is created, set its backgrounding accordingly. | 906 // Now that the process is created, set its backgrounding accordingly. |
| 935 SetBackgrounded(backgrounded_); | 907 SetBackgrounded(backgrounded_); |
| 936 | 908 |
| 937 InitVisitedLinks(); | 909 InitVisitedLinks(); |
| 938 InitUserScripts(); | 910 InitUserScripts(); |
| 939 InitExtensions(); | 911 InitExtensions(); |
| 940 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 941 // We don't want to initialize the spellchecker unless SpellCheckHost has been | 912 // We don't want to initialize the spellchecker unless SpellCheckHost has been |
| 942 // created. In InitSpellChecker(), we know if GetSpellCheckHost() is NULL | 913 // created. In InitSpellChecker(), we know if GetSpellCheckHost() is NULL |
| 943 // then the spellchecker has been turned off, but here, we don't know if | 914 // then the spellchecker has been turned off, but here, we don't know if |
| 944 // it's been turned off or just not loaded yet. | 915 // it's been turned off or just not loaded yet. |
| 945 if (profile()->GetSpellCheckHost()) | 916 if (profile()->GetSpellCheckHost()) |
| 946 InitSpellChecker(); | 917 InitSpellChecker(); |
| 947 #endif | |
| 948 | 918 |
| 949 if (max_page_id_ != -1) | 919 if (max_page_id_ != -1) |
| 950 Send(new ViewMsg_SetNextPageID(max_page_id_ + 1)); | 920 Send(new ViewMsg_SetNextPageID(max_page_id_ + 1)); |
| 951 | 921 |
| 952 while (!queued_messages_.empty()) { | 922 while (!queued_messages_.empty()) { |
| 953 Send(queued_messages_.front()); | 923 Send(queued_messages_.front()); |
| 954 queued_messages_.pop(); | 924 queued_messages_.pop(); |
| 955 } | 925 } |
| 956 | 926 |
| 957 NotificationService::current()->Notify( | 927 NotificationService::current()->Notify( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 974 event_name, id()); | 944 event_name, id()); |
| 975 } | 945 } |
| 976 } | 946 } |
| 977 | 947 |
| 978 void BrowserRenderProcessHost::OnExtensionCloseChannel(int port_id) { | 948 void BrowserRenderProcessHost::OnExtensionCloseChannel(int port_id) { |
| 979 if (profile()->GetExtensionMessageService()) { | 949 if (profile()->GetExtensionMessageService()) { |
| 980 profile()->GetExtensionMessageService()->CloseChannel(port_id); | 950 profile()->GetExtensionMessageService()->CloseChannel(port_id); |
| 981 } | 951 } |
| 982 } | 952 } |
| 983 | 953 |
| 984 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 985 void BrowserRenderProcessHost::OnSpellCheckerRequestDictionary() { | 954 void BrowserRenderProcessHost::OnSpellCheckerRequestDictionary() { |
| 986 // We may have gotten multiple requests from different renderers. We don't | 955 // We may have gotten multiple requests from different renderers. We don't |
| 987 // want to initialize multiple times in this case, so we set |force| to false. | 956 // want to initialize multiple times in this case, so we set |force| to false. |
| 988 profile()->ReinitializeSpellCheckHost(false); | 957 profile()->ReinitializeSpellCheckHost(false); |
| 989 } | 958 } |
| 990 | 959 |
| 991 void BrowserRenderProcessHost::AddSpellCheckWord(const std::string& word) { | 960 void BrowserRenderProcessHost::AddSpellCheckWord(const std::string& word) { |
| 992 Send(new ViewMsg_SpellChecker_WordAdded(word)); | 961 Send(new ViewMsg_SpellChecker_WordAdded(word)); |
| 993 } | 962 } |
| 994 | 963 |
| 995 void BrowserRenderProcessHost::InitSpellChecker() { | 964 void BrowserRenderProcessHost::InitSpellChecker() { |
| 996 SpellCheckHost* spellcheck_host = profile()->GetSpellCheckHost(); | 965 SpellCheckHost* spellcheck_host = profile()->GetSpellCheckHost(); |
| 997 if (spellcheck_host) { | 966 if (spellcheck_host) { |
| 998 PrefService* prefs = profile()->GetPrefs(); | 967 PrefService* prefs = profile()->GetPrefs(); |
| 999 IPC::PlatformFileForTransit file; | 968 IPC::PlatformFileForTransit file; |
| 969 |
| 970 if (spellcheck_host->bdict_file() != base::kInvalidPlatformFileValue) { |
| 1000 #if defined(OS_POSIX) | 971 #if defined(OS_POSIX) |
| 1001 file = base::FileDescriptor(spellcheck_host->bdict_file(), false); | 972 file = base::FileDescriptor(spellcheck_host->bdict_file(), false); |
| 1002 #elif defined(OS_WIN) | 973 #elif defined(OS_WIN) |
| 1003 ::DuplicateHandle(::GetCurrentProcess(), spellcheck_host->bdict_file(), | 974 ::DuplicateHandle(::GetCurrentProcess(), spellcheck_host->bdict_file(), |
| 1004 GetHandle(), &file, 0, false, DUPLICATE_SAME_ACCESS); | 975 GetHandle(), &file, 0, false, DUPLICATE_SAME_ACCESS); |
| 1005 #endif | 976 #endif |
| 977 } |
| 978 |
| 1006 Send(new ViewMsg_SpellChecker_Init( | 979 Send(new ViewMsg_SpellChecker_Init( |
| 1007 file, | 980 file, |
| 1008 spellcheck_host->custom_words(), | 981 spellcheck_host->custom_words(), |
| 1009 spellcheck_host->language(), | 982 spellcheck_host->language(), |
| 1010 prefs->GetBoolean(prefs::kEnableAutoSpellCorrect))); | 983 prefs->GetBoolean(prefs::kEnableAutoSpellCorrect))); |
| 1011 } else { | 984 } else { |
| 1012 Send(new ViewMsg_SpellChecker_Init( | 985 Send(new ViewMsg_SpellChecker_Init( |
| 1013 IPC::PlatformFileForTransit(), | 986 IPC::PlatformFileForTransit(), |
| 1014 std::vector<std::string>(), | 987 std::vector<std::string>(), |
| 1015 std::string(), | 988 std::string(), |
| 1016 false)); | 989 false)); |
| 1017 } | 990 } |
| 1018 } | 991 } |
| 1019 | 992 |
| 1020 void BrowserRenderProcessHost::EnableAutoSpellCorrect(bool enable) { | 993 void BrowserRenderProcessHost::EnableAutoSpellCorrect(bool enable) { |
| 1021 Send(new ViewMsg_SpellChecker_EnableAutoSpellCorrect(enable)); | 994 Send(new ViewMsg_SpellChecker_EnableAutoSpellCorrect(enable)); |
| 1022 } | 995 } |
| 1023 #endif | |
| OLD | NEW |