Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(316)

Side by Side Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 8515027: Define the public version of the browser side RenderProcessHost interface. This interface is not ... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "content/browser/renderer_host/browser_render_process_host.h" 8 #include "content/browser/renderer_host/render_process_host_impl.h"
9 9
10 #include <algorithm> 10 #include <algorithm>
11 #include <limits> 11 #include <limits>
12 #include <vector> 12 #include <vector>
13 13
14 #if defined(OS_POSIX) 14 #if defined(OS_POSIX)
15 #include <utility> // for pair<> 15 #include <utility> // for pair<>
16 #endif 16 #endif
17 17
18 #include "base/base_switches.h" 18 #include "base/base_switches.h"
19 #include "base/bind.h" 19 #include "base/bind.h"
20 #include "base/bind_helpers.h" 20 #include "base/bind_helpers.h"
21 #include "base/callback.h" 21 #include "base/callback.h"
22 #include "base/command_line.h" 22 #include "base/command_line.h"
23 #include "base/lazy_instance.h"
23 #include "base/logging.h" 24 #include "base/logging.h"
24 #include "base/metrics/field_trial.h" 25 #include "base/metrics/field_trial.h"
25 #include "base/metrics/histogram.h" 26 #include "base/metrics/histogram.h"
26 #include "base/path_service.h" 27 #include "base/path_service.h"
27 #include "base/platform_file.h" 28 #include "base/platform_file.h"
29 #include "base/rand_util.h"
28 #include "base/stl_util.h" 30 #include "base/stl_util.h"
29 #include "base/string_util.h" 31 #include "base/string_util.h"
32 #include "base/sys_info.h"
30 #include "base/threading/thread.h" 33 #include "base/threading/thread.h"
31 #include "base/threading/thread_restrictions.h" 34 #include "base/threading/thread_restrictions.h"
32 #include "content/browser/appcache/appcache_dispatcher_host.h" 35 #include "content/browser/appcache/appcache_dispatcher_host.h"
33 #include "content/browser/browser_child_process_host.h" 36 #include "content/browser/browser_child_process_host.h"
34 #include "content/browser/browser_context.h" 37 #include "content/browser/browser_context.h"
38 #include "content/browser/browser_main.h"
35 #include "content/browser/child_process_security_policy.h" 39 #include "content/browser/child_process_security_policy.h"
36 #include "content/browser/device_orientation/message_filter.h" 40 #include "content/browser/device_orientation/message_filter.h"
37 #include "content/browser/download/mhtml_generation_manager.h" 41 #include "content/browser/download/mhtml_generation_manager.h"
38 #include "content/browser/file_system/file_system_dispatcher_host.h" 42 #include "content/browser/file_system/file_system_dispatcher_host.h"
39 #include "content/browser/geolocation/geolocation_dispatcher_host.h" 43 #include "content/browser/geolocation/geolocation_dispatcher_host.h"
40 #include "content/browser/gpu/gpu_data_manager.h" 44 #include "content/browser/gpu/gpu_data_manager.h"
41 #include "content/browser/gpu/gpu_process_host.h" 45 #include "content/browser/gpu/gpu_process_host.h"
42 #include "content/browser/in_process_webkit/dom_storage_message_filter.h" 46 #include "content/browser/in_process_webkit/dom_storage_message_filter.h"
43 #include "content/browser/in_process_webkit/indexed_db_dispatcher_host.h" 47 #include "content/browser/in_process_webkit/indexed_db_dispatcher_host.h"
44 #include "content/browser/mime_registry_message_filter.h" 48 #include "content/browser/mime_registry_message_filter.h"
(...skipping 16 matching lines...) Expand all
61 #include "content/browser/renderer_host/render_view_host_delegate.h" 65 #include "content/browser/renderer_host/render_view_host_delegate.h"
62 #include "content/browser/renderer_host/render_widget_helper.h" 66 #include "content/browser/renderer_host/render_widget_helper.h"
63 #include "content/browser/renderer_host/render_widget_host.h" 67 #include "content/browser/renderer_host/render_widget_host.h"
64 #include "content/browser/renderer_host/resource_message_filter.h" 68 #include "content/browser/renderer_host/resource_message_filter.h"
65 #include "content/browser/renderer_host/socket_stream_dispatcher_host.h" 69 #include "content/browser/renderer_host/socket_stream_dispatcher_host.h"
66 #include "content/browser/renderer_host/text_input_client_message_filter.h" 70 #include "content/browser/renderer_host/text_input_client_message_filter.h"
67 #include "content/browser/resolve_proxy_msg_helper.h" 71 #include "content/browser/resolve_proxy_msg_helper.h"
68 #include "content/browser/speech/speech_input_dispatcher_host.h" 72 #include "content/browser/speech/speech_input_dispatcher_host.h"
69 #include "content/browser/trace_message_filter.h" 73 #include "content/browser/trace_message_filter.h"
70 #include "content/browser/user_metrics.h" 74 #include "content/browser/user_metrics.h"
75 #include "content/browser/webui/web_ui_factory.h"
71 #include "content/browser/worker_host/worker_message_filter.h" 76 #include "content/browser/worker_host/worker_message_filter.h"
72 #include "content/common/child_process_info.h" 77 #include "content/common/child_process_info.h"
73 #include "content/common/child_process_messages.h" 78 #include "content/common/child_process_messages.h"
74 #include "content/common/gpu/gpu_messages.h" 79 #include "content/common/gpu/gpu_messages.h"
75 #include "content/public/browser/notification_service.h" 80 #include "content/public/browser/notification_service.h"
76 #include "content/common/process_watcher.h" 81 #include "content/common/process_watcher.h"
77 #include "content/common/resource_messages.h" 82 #include "content/common/resource_messages.h"
78 #include "content/common/view_messages.h" 83 #include "content/common/view_messages.h"
79 #include "content/public/browser/content_browser_client.h" 84 #include "content/public/browser/content_browser_client.h"
85 #include "content/public/common/content_constants.h"
80 #include "content/public/common/content_switches.h" 86 #include "content/public/common/content_switches.h"
81 #include "content/public/common/result_codes.h" 87 #include "content/public/common/result_codes.h"
82 #include "content/renderer/render_process_impl.h" 88 #include "content/renderer/render_process_impl.h"
83 #include "content/renderer/render_thread_impl.h" 89 #include "content/renderer/render_thread_impl.h"
84 #include "ipc/ipc_logging.h" 90 #include "ipc/ipc_logging.h"
85 #include "ipc/ipc_platform_file.h" 91 #include "ipc/ipc_platform_file.h"
86 #include "ipc/ipc_switches.h" 92 #include "ipc/ipc_switches.h"
87 #include "media/base/media_switches.h" 93 #include "media/base/media_switches.h"
88 #include "net/url_request/url_request_context_getter.h" 94 #include "net/url_request/url_request_context_getter.h"
89 #include "ui/base/ui_base_switches.h" 95 #include "ui/base/ui_base_switches.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 return request_context->GetURLRequestContext(); 182 return request_context->GetURLRequestContext();
177 } 183 }
178 184
179 private: 185 private:
180 virtual ~RendererURLRequestContextSelector() {} 186 virtual ~RendererURLRequestContextSelector() {}
181 187
182 scoped_refptr<net::URLRequestContextGetter> request_context_; 188 scoped_refptr<net::URLRequestContextGetter> request_context_;
183 scoped_refptr<net::URLRequestContextGetter> media_request_context_; 189 scoped_refptr<net::URLRequestContextGetter> media_request_context_;
184 }; 190 };
185 191
192 size_t max_renderer_count_override = 0;
193
194 size_t GetMaxRendererProcessCount() {
195 if (max_renderer_count_override)
196 return max_renderer_count_override;
197
198 // Defines the maximum number of renderer processes according to the
199 // amount of installed memory as reported by the OS. The table
200 // values are calculated by assuming that you want the renderers to
201 // use half of the installed ram and assuming that each tab uses
202 // ~40MB, however the curve is not linear but piecewise linear with
203 // interleaved slopes of 3 and 2.
204 // If you modify this table you need to adjust browser\browser_uitest.cc
205 // to match the expected number of processes.
206
207 static const size_t kMaxRenderersByRamTier[] = {
208 3, // less than 256MB
209 6, // 256MB
210 9, // 512MB
211 12, // 768MB
212 14, // 1024MB
213 18, // 1280MB
214 20, // 1536MB
215 22, // 1792MB
216 24, // 2048MB
217 26, // 2304MB
218 29, // 2560MB
219 32, // 2816MB
220 35, // 3072MB
221 38, // 3328MB
222 40 // 3584MB
223 };
224
225 static size_t max_count = 0;
226 if (!max_count) {
227 size_t memory_tier = base::SysInfo::AmountOfPhysicalMemoryMB() / 256;
228 if (memory_tier >= arraysize(kMaxRenderersByRamTier))
229 max_count = content::kMaxRendererProcessCount;
230 else
231 max_count = kMaxRenderersByRamTier[memory_tier];
232 }
233 return max_count;
234 }
235
236 // Returns true if the given host is suitable for launching a new view
237 // associated with the given browser context.
238 static bool IsSuitableHost(RenderProcessHost* host,
239 content::BrowserContext* browser_context,
240 const GURL& site_url) {
241 if (host->GetBrowserContext() != browser_context)
242 return false;
243
244 if (ChildProcessSecurityPolicy::GetInstance()->HasWebUIBindings(
245 host->GetID()) !=
246 content::WebUIFactory::Get()->HasWebUIScheme(site_url))
247 return false;
248
249 return content::GetContentClient()->browser()->IsSuitableHost(host, site_url);
250 }
251
186 } // namespace 252 } // namespace
187 253
188 BrowserRenderProcessHost::BrowserRenderProcessHost( 254 // the global list of all renderer processes
255 base::LazyInstance<IDMap<RenderProcessHost>,
256 base::LeakyLazyInstanceTraits<IDMap<RenderProcessHost> > >
257 g_all_hosts(base::LINKER_INITIALIZED);
258
259 // static
260 bool g_run_renderer_in_process_ = false;
261
262 // static
263 void RenderProcessHost::SetMaxRendererProcessCountForTest(size_t count) {
264 max_renderer_count_override = count;
265 }
266
267 RenderProcessHostImpl::RenderProcessHostImpl(
189 content::BrowserContext* browser_context) 268 content::BrowserContext* browser_context)
190 : RenderProcessHost(browser_context), 269 : visible_widgets_(0),
191 visible_widgets_(0),
192 backgrounded_(true), 270 backgrounded_(true),
193 ALLOW_THIS_IN_INITIALIZER_LIST(cached_dibs_cleaner_( 271 ALLOW_THIS_IN_INITIALIZER_LIST(cached_dibs_cleaner_(
194 FROM_HERE, base::TimeDelta::FromSeconds(5), 272 FROM_HERE, base::TimeDelta::FromSeconds(5),
195 this, &BrowserRenderProcessHost::ClearTransportDIBCache)), 273 this, &RenderProcessHostImpl::ClearTransportDIBCache)),
196 accessibility_enabled_(false), 274 accessibility_enabled_(false),
197 is_initialized_(false) { 275 is_initialized_(false),
276 max_page_id_(-1),
277 fast_shutdown_started_(false),
278 deleting_soon_(false),
279 pending_views_(0),
280 id_(ChildProcessInfo::GenerateChildProcessUniqueId()),
281 browser_context_(browser_context),
282 sudden_termination_allowed_(true),
283 ignore_input_events_(false) {
198 widget_helper_ = new RenderWidgetHelper(); 284 widget_helper_ = new RenderWidgetHelper();
199 285
200 ChildProcessSecurityPolicy::GetInstance()->Add(id()); 286 ChildProcessSecurityPolicy::GetInstance()->Add(GetID());
201 287
202 // Grant most file permissions to this renderer. 288 // Grant most file permissions to this renderer.
203 // PLATFORM_FILE_TEMPORARY, PLATFORM_FILE_HIDDEN and 289 // PLATFORM_FILE_TEMPORARY, PLATFORM_FILE_HIDDEN and
204 // PLATFORM_FILE_DELETE_ON_CLOSE are not granted, because no existing API 290 // PLATFORM_FILE_DELETE_ON_CLOSE are not granted, because no existing API
205 // requests them. 291 // requests them.
206 // This is for the filesystem sandbox. 292 // This is for the filesystem sandbox.
207 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile( 293 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile(
208 id(), browser_context->GetPath().Append( 294 GetID(), browser_context->GetPath().Append(
209 fileapi::SandboxMountPointProvider::kNewFileSystemDirectory), 295 fileapi::SandboxMountPointProvider::kNewFileSystemDirectory),
210 base::PLATFORM_FILE_OPEN | 296 base::PLATFORM_FILE_OPEN |
211 base::PLATFORM_FILE_CREATE | 297 base::PLATFORM_FILE_CREATE |
212 base::PLATFORM_FILE_OPEN_ALWAYS | 298 base::PLATFORM_FILE_OPEN_ALWAYS |
213 base::PLATFORM_FILE_CREATE_ALWAYS | 299 base::PLATFORM_FILE_CREATE_ALWAYS |
214 base::PLATFORM_FILE_OPEN_TRUNCATED | 300 base::PLATFORM_FILE_OPEN_TRUNCATED |
215 base::PLATFORM_FILE_READ | 301 base::PLATFORM_FILE_READ |
216 base::PLATFORM_FILE_WRITE | 302 base::PLATFORM_FILE_WRITE |
217 base::PLATFORM_FILE_EXCLUSIVE_READ | 303 base::PLATFORM_FILE_EXCLUSIVE_READ |
218 base::PLATFORM_FILE_EXCLUSIVE_WRITE | 304 base::PLATFORM_FILE_EXCLUSIVE_WRITE |
219 base::PLATFORM_FILE_ASYNC | 305 base::PLATFORM_FILE_ASYNC |
220 base::PLATFORM_FILE_WRITE_ATTRIBUTES | 306 base::PLATFORM_FILE_WRITE_ATTRIBUTES |
221 base::PLATFORM_FILE_ENUMERATE); 307 base::PLATFORM_FILE_ENUMERATE);
222 // This is so that we can read and move stuff out of the old filesystem 308 // This is so that we can read and move stuff out of the old filesystem
223 // sandbox. 309 // sandbox.
224 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile( 310 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile(
225 id(), browser_context->GetPath().Append( 311 GetID(), browser_context->GetPath().Append(
226 fileapi::SandboxMountPointProvider::kOldFileSystemDirectory), 312 fileapi::SandboxMountPointProvider::kOldFileSystemDirectory),
227 base::PLATFORM_FILE_READ | base::PLATFORM_FILE_WRITE | 313 base::PLATFORM_FILE_READ | base::PLATFORM_FILE_WRITE |
228 base::PLATFORM_FILE_WRITE_ATTRIBUTES | base::PLATFORM_FILE_ENUMERATE); 314 base::PLATFORM_FILE_WRITE_ATTRIBUTES | base::PLATFORM_FILE_ENUMERATE);
229 // This is so that we can rename the old sandbox out of the way so that we 315 // This is so that we can rename the old sandbox out of the way so that we
230 // know we've taken care of it. 316 // know we've taken care of it.
231 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile( 317 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile(
232 id(), browser_context->GetPath().Append( 318 GetID(), browser_context->GetPath().Append(
233 fileapi::SandboxMountPointProvider::kRenamedOldFileSystemDirectory), 319 fileapi::SandboxMountPointProvider::kRenamedOldFileSystemDirectory),
234 base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_CREATE_ALWAYS | 320 base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_CREATE_ALWAYS |
235 base::PLATFORM_FILE_WRITE); 321 base::PLATFORM_FILE_WRITE);
236 322
237 // Note: When we create the BrowserRenderProcessHost, it's technically 323 CHECK(!content::ExitedMainMessageLoop());
324 g_all_hosts.Get().AddWithID(this, GetID());
325 g_all_hosts.Get().set_check_on_null_data(true);
326 // Initialize |child_process_activity_time_| to a reasonable value.
327 mark_child_process_activity_time();
328 // Note: When we create the RenderProcessHostImpl, it's technically
238 // backgrounded, because it has no visible listeners. But the process 329 // backgrounded, because it has no visible listeners. But the process
239 // doesn't actually exist yet, so we'll Background it later, after 330 // doesn't actually exist yet, so we'll Background it later, after
240 // creation. 331 // creation.
241 } 332 }
242 333
243 BrowserRenderProcessHost::~BrowserRenderProcessHost() { 334 RenderProcessHostImpl::~RenderProcessHostImpl() {
244 ChildProcessSecurityPolicy::GetInstance()->Remove(id()); 335 ChildProcessSecurityPolicy::GetInstance()->Remove(GetID());
245 336
246 // We may have some unsent messages at this point, but that's OK. 337 // We may have some unsent messages at this point, but that's OK.
247 channel_.reset(); 338 channel_.reset();
248 while (!queued_messages_.empty()) { 339 while (!queued_messages_.empty()) {
249 delete queued_messages_.front(); 340 delete queued_messages_.front();
250 queued_messages_.pop(); 341 queued_messages_.pop();
251 } 342 }
252 343
253 ClearTransportDIBCache(); 344 ClearTransportDIBCache();
345 if (g_all_hosts.Get().Lookup(GetID()))
346 g_all_hosts.Get().Remove(GetID());
254 } 347 }
255 348
256 void BrowserRenderProcessHost::EnableSendQueue() { 349 void RenderProcessHostImpl::EnableSendQueue() {
257 is_initialized_ = false; 350 is_initialized_ = false;
258 } 351 }
259 352
260 bool BrowserRenderProcessHost::Init(bool is_accessibility_enabled) { 353 bool RenderProcessHostImpl::Init(bool is_accessibility_enabled) {
261 // calling Init() more than once does nothing, this makes it more convenient 354 // calling Init() more than once does nothing, this makes it more convenient
262 // for the view host which may not be sure in some cases 355 // for the view host which may not be sure in some cases
263 if (channel_.get()) 356 if (channel_.get())
264 return true; 357 return true;
265 358
266 accessibility_enabled_ = is_accessibility_enabled; 359 accessibility_enabled_ = is_accessibility_enabled;
267 360
268 CommandLine::StringType renderer_prefix; 361 CommandLine::StringType renderer_prefix;
269 #if defined(OS_POSIX) 362 #if defined(OS_POSIX)
270 // A command prefix is something prepended to the command line of the spawned 363 // A command prefix is something prepended to the command line of the spawned
(...skipping 17 matching lines...) Expand all
288 return false; 381 return false;
289 382
290 // Setup the IPC channel. 383 // Setup the IPC channel.
291 const std::string channel_id = 384 const std::string channel_id =
292 ChildProcessInfo::GenerateRandomChannelID(this); 385 ChildProcessInfo::GenerateRandomChannelID(this);
293 channel_.reset(new IPC::ChannelProxy( 386 channel_.reset(new IPC::ChannelProxy(
294 channel_id, IPC::Channel::MODE_SERVER, this, 387 channel_id, IPC::Channel::MODE_SERVER, this,
295 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))); 388 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)));
296 389
297 // Call the embedder first so that their IPC filters have priority. 390 // Call the embedder first so that their IPC filters have priority.
298 content::GetContentClient()->browser()->BrowserRenderProcessHostCreated(this); 391 content::GetContentClient()->browser()->RenderProcessHostCreated(
392 this);
299 393
300 CreateMessageFilters(); 394 CreateMessageFilters();
301 395
302 if (run_renderer_in_process()) { 396 if (run_renderer_in_process()) {
303 // Crank up a thread and run the initialization there. With the way that 397 // Crank up a thread and run the initialization there. With the way that
304 // messages flow between the browser and renderer, this thread is required 398 // messages flow between the browser and renderer, this thread is required
305 // to prevent a deadlock in single-process mode. Since the primordial 399 // to prevent a deadlock in single-process mode. Since the primordial
306 // thread in the renderer process runs the WebKit code and can sometimes 400 // thread in the renderer process runs the WebKit code and can sometimes
307 // make blocking calls to the UI thread (i.e. this thread), they need to run 401 // make blocking calls to the UI thread (i.e. this thread), they need to run
308 // on separate threads. 402 // on separate threads.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 cmd_line, 437 cmd_line,
344 this)); 438 this));
345 439
346 fast_shutdown_started_ = false; 440 fast_shutdown_started_ = false;
347 } 441 }
348 442
349 is_initialized_ = true; 443 is_initialized_ = true;
350 return true; 444 return true;
351 } 445 }
352 446
353 void BrowserRenderProcessHost::CreateMessageFilters() { 447 void RenderProcessHostImpl::CreateMessageFilters() {
354 scoped_refptr<RenderMessageFilter> render_message_filter( 448 scoped_refptr<RenderMessageFilter> render_message_filter(
355 new RenderMessageFilter( 449 new RenderMessageFilter(
356 id(), 450 GetID(),
357 PluginService::GetInstance(), 451 PluginService::GetInstance(),
358 browser_context(), 452 GetBrowserContext(),
359 browser_context()->GetRequestContextForRenderProcess(id()), 453 GetBrowserContext()->GetRequestContextForRenderProcess(GetID()),
360 widget_helper_)); 454 widget_helper_));
361 channel_->AddFilter(render_message_filter); 455 channel_->AddFilter(render_message_filter);
362 456
363 ResourceMessageFilter* resource_message_filter = new ResourceMessageFilter( 457 ResourceMessageFilter* resource_message_filter = new ResourceMessageFilter(
364 id(), ChildProcessInfo::RENDER_PROCESS, 458 GetID(), ChildProcessInfo::RENDER_PROCESS,
365 &browser_context()->GetResourceContext(), 459 &GetBrowserContext()->GetResourceContext(),
366 new RendererURLRequestContextSelector(browser_context(), id()), 460 new RendererURLRequestContextSelector(GetBrowserContext(), GetID()),
367 content::GetContentClient()->browser()->GetResourceDispatcherHost()); 461 content::GetContentClient()->browser()->GetResourceDispatcherHost());
368 462
369 channel_->AddFilter(resource_message_filter); 463 channel_->AddFilter(resource_message_filter);
370 channel_->AddFilter(new AudioInputRendererHost( 464 channel_->AddFilter(new AudioInputRendererHost(
371 &browser_context()->GetResourceContext())); 465 &GetBrowserContext()->GetResourceContext()));
372 channel_->AddFilter( 466 channel_->AddFilter(
373 new AudioRendererHost(&browser_context()->GetResourceContext())); 467 new AudioRendererHost(&GetBrowserContext()->GetResourceContext()));
374 channel_->AddFilter( 468 channel_->AddFilter(
375 new VideoCaptureHost(&browser_context()->GetResourceContext())); 469 new VideoCaptureHost(&GetBrowserContext()->GetResourceContext()));
376 channel_->AddFilter( 470 channel_->AddFilter(
377 new AppCacheDispatcherHost(browser_context()->GetAppCacheService(), 471 new AppCacheDispatcherHost(GetBrowserContext()->GetAppCacheService(),
378 id())); 472 GetID()));
379 channel_->AddFilter(new ClipboardMessageFilter()); 473 channel_->AddFilter(new ClipboardMessageFilter());
380 channel_->AddFilter( 474 channel_->AddFilter(
381 new DOMStorageMessageFilter(id(), browser_context()->GetWebKitContext())); 475 new DOMStorageMessageFilter(GetID(),
476 GetBrowserContext()->GetWebKitContext()));
382 channel_->AddFilter( 477 channel_->AddFilter(
383 new IndexedDBDispatcherHost(id(), browser_context()->GetWebKitContext())); 478 new IndexedDBDispatcherHost(GetID(),
479 GetBrowserContext()->GetWebKitContext()));
384 channel_->AddFilter( 480 channel_->AddFilter(
385 GeolocationDispatcherHost::New( 481 GeolocationDispatcherHost::New(
386 id(), browser_context()->GetGeolocationPermissionContext())); 482 GetID(), GetBrowserContext()->GetGeolocationPermissionContext()));
387 channel_->AddFilter(new GpuMessageFilter(id(), widget_helper_.get())); 483 channel_->AddFilter(new GpuMessageFilter(GetID(), widget_helper_.get()));
388 channel_->AddFilter(new media_stream::MediaStreamDispatcherHost( 484 channel_->AddFilter(new media_stream::MediaStreamDispatcherHost(
389 &browser_context()->GetResourceContext(), id())); 485 &GetBrowserContext()->GetResourceContext(), GetID()));
390 channel_->AddFilter(new PepperFileMessageFilter(id(), browser_context())); 486 channel_->AddFilter(new PepperFileMessageFilter(GetID(),
487 GetBrowserContext()));
391 channel_->AddFilter( 488 channel_->AddFilter(
392 new PepperMessageFilter(&browser_context()->GetResourceContext())); 489 new PepperMessageFilter(&GetBrowserContext()->GetResourceContext()));
393 channel_->AddFilter(new speech_input::SpeechInputDispatcherHost( 490 channel_->AddFilter(new speech_input::SpeechInputDispatcherHost(
394 id(), browser_context()->GetRequestContext(), 491 GetID(), GetBrowserContext()->GetRequestContext(),
395 browser_context()->GetSpeechInputPreferences())); 492 GetBrowserContext()->GetSpeechInputPreferences()));
396 channel_->AddFilter( 493 channel_->AddFilter(
397 new FileSystemDispatcherHost(browser_context()->GetRequestContext(), 494 new FileSystemDispatcherHost(
398 browser_context()->GetFileSystemContext())); 495 GetBrowserContext()->GetRequestContext(),
496 GetBrowserContext()->GetFileSystemContext()));
399 channel_->AddFilter(new device_orientation::MessageFilter()); 497 channel_->AddFilter(new device_orientation::MessageFilter());
400 channel_->AddFilter( 498 channel_->AddFilter(
401 new BlobMessageFilter(id(), browser_context()->GetBlobStorageContext())); 499 new BlobMessageFilter(GetID(),
402 channel_->AddFilter(new FileUtilitiesMessageFilter(id())); 500 GetBrowserContext()->GetBlobStorageContext()));
501 channel_->AddFilter(new FileUtilitiesMessageFilter(GetID()));
403 channel_->AddFilter(new MimeRegistryMessageFilter()); 502 channel_->AddFilter(new MimeRegistryMessageFilter());
404 channel_->AddFilter(new DatabaseMessageFilter( 503 channel_->AddFilter(new DatabaseMessageFilter(
405 browser_context()->GetDatabaseTracker())); 504 GetBrowserContext()->GetDatabaseTracker()));
406 #if defined(OS_MACOSX) 505 #if defined(OS_MACOSX)
407 channel_->AddFilter(new TextInputClientMessageFilter(id())); 506 channel_->AddFilter(new TextInputClientMessageFilter(GetID()));
408 #endif 507 #endif
409 508
410 SocketStreamDispatcherHost* socket_stream_dispatcher_host = 509 SocketStreamDispatcherHost* socket_stream_dispatcher_host =
411 new SocketStreamDispatcherHost( 510 new SocketStreamDispatcherHost(
412 new RendererURLRequestContextSelector(browser_context(), id()), 511 new RendererURLRequestContextSelector(GetBrowserContext(), GetID()),
413 &browser_context()->GetResourceContext()); 512 &GetBrowserContext()->GetResourceContext());
414 channel_->AddFilter(socket_stream_dispatcher_host); 513 channel_->AddFilter(socket_stream_dispatcher_host);
415 514
416 channel_->AddFilter( 515 channel_->AddFilter(
417 new WorkerMessageFilter( 516 new WorkerMessageFilter(
418 id(), 517 GetID(),
419 &browser_context()->GetResourceContext(), 518 &GetBrowserContext()->GetResourceContext(),
420 content::GetContentClient()->browser()->GetResourceDispatcherHost(), 519 content::GetContentClient()->browser()->GetResourceDispatcherHost(),
421 base::Bind(&RenderWidgetHelper::GetNextRoutingID, 520 base::Bind(&RenderWidgetHelper::GetNextRoutingID,
422 base::Unretained(widget_helper_.get())))); 521 base::Unretained(widget_helper_.get()))));
423 522
424 #if defined(ENABLE_P2P_APIS) 523 #if defined(ENABLE_P2P_APIS)
425 channel_->AddFilter(new content::P2PSocketDispatcherHost( 524 channel_->AddFilter(new content::P2PSocketDispatcherHost(
426 &browser_context()->GetResourceContext())); 525 &GetBrowserContext()->GetResourceContext()));
427 #endif 526 #endif
428 527
429 channel_->AddFilter(new TraceMessageFilter()); 528 channel_->AddFilter(new TraceMessageFilter());
430 channel_->AddFilter(new ResolveProxyMsgHelper( 529 channel_->AddFilter(new ResolveProxyMsgHelper(
431 browser_context()->GetRequestContextForRenderProcess(id()))); 530 GetBrowserContext()->GetRequestContextForRenderProcess(GetID())));
432 channel_->AddFilter(new QuotaDispatcherHost( 531 channel_->AddFilter(new QuotaDispatcherHost(
433 id(), browser_context()->GetQuotaManager(), 532 GetID(), GetBrowserContext()->GetQuotaManager(),
434 content::GetContentClient()->browser()->CreateQuotaPermissionContext())); 533 content::GetContentClient()->browser()->CreateQuotaPermissionContext()));
435 } 534 }
436 535
437 int BrowserRenderProcessHost::GetNextRoutingID() { 536 int RenderProcessHostImpl::GetNextRoutingID() {
438 return widget_helper_->GetNextRoutingID(); 537 return widget_helper_->GetNextRoutingID();
439 } 538 }
440 539
441 void BrowserRenderProcessHost::CancelResourceRequests(int render_widget_id) { 540 void RenderProcessHostImpl::CancelResourceRequests(int render_widget_id) {
442 widget_helper_->CancelResourceRequests(render_widget_id); 541 widget_helper_->CancelResourceRequests(render_widget_id);
443 } 542 }
444 543
445 void BrowserRenderProcessHost::CrossSiteSwapOutACK( 544 void RenderProcessHostImpl::CrossSiteSwapOutACK(
446 const ViewMsg_SwapOut_Params& params) { 545 const ViewMsg_SwapOut_Params& params) {
447 widget_helper_->CrossSiteSwapOutACK(params); 546 widget_helper_->CrossSiteSwapOutACK(params);
448 } 547 }
449 548
450 bool BrowserRenderProcessHost::WaitForUpdateMsg( 549 bool RenderProcessHostImpl::WaitForUpdateMsg(
451 int render_widget_id, 550 int render_widget_id,
452 const base::TimeDelta& max_delay, 551 const base::TimeDelta& max_delay,
453 IPC::Message* msg) { 552 IPC::Message* msg) {
454 // The post task to this thread with the process id could be in queue, and we 553 // The post task to this thread with the process id could be in queue, and we
455 // don't want to dispatch a message before then since it will need the handle. 554 // don't want to dispatch a message before then since it will need the handle.
456 if (child_process_launcher_.get() && child_process_launcher_->IsStarting()) 555 if (child_process_launcher_.get() && child_process_launcher_->IsStarting())
457 return false; 556 return false;
458 557
459 return widget_helper_->WaitForUpdateMsg(render_widget_id, max_delay, msg); 558 return widget_helper_->WaitForUpdateMsg(render_widget_id, max_delay, msg);
460 } 559 }
461 560
462 void BrowserRenderProcessHost::ReceivedBadMessage() { 561 void RenderProcessHostImpl::ReceivedBadMessage() {
463 if (run_renderer_in_process()) { 562 if (run_renderer_in_process()) {
464 // In single process mode it is better if we don't suicide but just 563 // In single process mode it is better if we don't suicide but just
465 // crash. 564 // crash.
466 CHECK(false); 565 CHECK(false);
467 } 566 }
468 NOTREACHED(); 567 NOTREACHED();
469 base::KillProcess(GetHandle(), content::RESULT_CODE_KILLED_BAD_MESSAGE, 568 base::KillProcess(GetHandle(), content::RESULT_CODE_KILLED_BAD_MESSAGE,
470 false); 569 false);
471 } 570 }
472 571
473 void BrowserRenderProcessHost::WidgetRestored() { 572 void RenderProcessHostImpl::WidgetRestored() {
474 // Verify we were properly backgrounded. 573 // Verify we were properly backgrounded.
475 DCHECK_EQ(backgrounded_, (visible_widgets_ == 0)); 574 DCHECK_EQ(backgrounded_, (visible_widgets_ == 0));
476 visible_widgets_++; 575 visible_widgets_++;
477 SetBackgrounded(false); 576 SetBackgrounded(false);
478 } 577 }
479 578
480 void BrowserRenderProcessHost::WidgetHidden() { 579 void RenderProcessHostImpl::WidgetHidden() {
481 // On startup, the browser will call Hide 580 // On startup, the browser will call Hide
482 if (backgrounded_) 581 if (backgrounded_)
483 return; 582 return;
484 583
485 DCHECK_EQ(backgrounded_, (visible_widgets_ == 0)); 584 DCHECK_EQ(backgrounded_, (visible_widgets_ == 0));
486 visible_widgets_--; 585 visible_widgets_--;
487 DCHECK_GE(visible_widgets_, 0); 586 DCHECK_GE(visible_widgets_, 0);
488 if (visible_widgets_ == 0) { 587 if (visible_widgets_ == 0) {
489 DCHECK(!backgrounded_); 588 DCHECK(!backgrounded_);
490 SetBackgrounded(true); 589 SetBackgrounded(true);
491 } 590 }
492 } 591 }
493 592
494 int BrowserRenderProcessHost::VisibleWidgetCount() const { 593 int RenderProcessHostImpl::VisibleWidgetCount() const {
495 return visible_widgets_; 594 return visible_widgets_;
496 } 595 }
497 596
498 void BrowserRenderProcessHost::AppendRendererCommandLine( 597 void RenderProcessHostImpl::AppendRendererCommandLine(
499 CommandLine* command_line) const { 598 CommandLine* command_line) const {
500 // Pass the process type first, so it shows first in process listings. 599 // Pass the process type first, so it shows first in process listings.
501 command_line->AppendSwitchASCII(switches::kProcessType, 600 command_line->AppendSwitchASCII(switches::kProcessType,
502 switches::kRendererProcess); 601 switches::kRendererProcess);
503 602
504 if (accessibility_enabled_) 603 if (accessibility_enabled_)
505 command_line->AppendSwitch(switches::kEnableAccessibility); 604 command_line->AppendSwitch(switches::kEnableAccessibility);
506 605
507 // Now send any options from our own command line we want to propagate. 606 // Now send any options from our own command line we want to propagate.
508 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 607 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
509 PropagateBrowserCommandLineToRenderer(browser_command_line, command_line); 608 PropagateBrowserCommandLineToRenderer(browser_command_line, command_line);
510 609
511 // Pass on the browser locale. 610 // Pass on the browser locale.
512 const std::string locale = 611 const std::string locale =
513 content::GetContentClient()->browser()->GetApplicationLocale(); 612 content::GetContentClient()->browser()->GetApplicationLocale();
514 command_line->AppendSwitchASCII(switches::kLang, locale); 613 command_line->AppendSwitchASCII(switches::kLang, locale);
515 614
516 // If we run base::FieldTrials, we want to pass to their state to the 615 // If we run base::FieldTrials, we want to pass to their state to the
517 // renderer so that it can act in accordance with each state, or record 616 // renderer so that it can act in accordance with each state, or record
518 // histograms relating to the base::FieldTrial states. 617 // histograms relating to the base::FieldTrial states.
519 std::string field_trial_states; 618 std::string field_trial_states;
520 base::FieldTrialList::StatesToString(&field_trial_states); 619 base::FieldTrialList::StatesToString(&field_trial_states);
521 if (!field_trial_states.empty()) { 620 if (!field_trial_states.empty()) {
522 command_line->AppendSwitchASCII(switches::kForceFieldTestNameAndValue, 621 command_line->AppendSwitchASCII(switches::kForceFieldTestNameAndValue,
523 field_trial_states); 622 field_trial_states);
524 } 623 }
525 624
526 content::GetContentClient()->browser()->AppendExtraCommandLineSwitches( 625 content::GetContentClient()->browser()->AppendExtraCommandLineSwitches(
527 command_line, id()); 626 command_line, GetID());
528 627
529 // Appending disable-gpu-feature switches due to software rendering list. 628 // Appending disable-gpu-feature switches due to software rendering list.
530 GpuDataManager* gpu_data_manager = GpuDataManager::GetInstance(); 629 GpuDataManager* gpu_data_manager = GpuDataManager::GetInstance();
531 DCHECK(gpu_data_manager); 630 DCHECK(gpu_data_manager);
532 gpu_data_manager->AppendRendererCommandLine(command_line); 631 gpu_data_manager->AppendRendererCommandLine(command_line);
533 } 632 }
534 633
535 void BrowserRenderProcessHost::PropagateBrowserCommandLineToRenderer( 634 void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
536 const CommandLine& browser_cmd, 635 const CommandLine& browser_cmd,
537 CommandLine* renderer_cmd) const { 636 CommandLine* renderer_cmd) const {
538 // Propagate the following switches to the renderer command line (along 637 // Propagate the following switches to the renderer command line (along
539 // with any associated values) if present in the browser command line. 638 // with any associated values) if present in the browser command line.
540 static const char* const kSwitchNames[] = { 639 static const char* const kSwitchNames[] = {
541 // We propagate the Chrome Frame command line here as well in case the 640 // We propagate the Chrome Frame command line here as well in case the
542 // renderer is not run in the sandbox. 641 // renderer is not run in the sandbox.
543 switches::kAuditAllHandles, 642 switches::kAuditAllHandles,
544 switches::kAuditHandles, 643 switches::kAuditHandles,
545 switches::kChromeFrame, 644 switches::kChromeFrame,
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 switches::kUserAgent, 722 switches::kUserAgent,
624 switches::kV, 723 switches::kV,
625 switches::kVideoThreads, 724 switches::kVideoThreads,
626 switches::kVModule, 725 switches::kVModule,
627 switches::kWebCoreLogChannels, 726 switches::kWebCoreLogChannels,
628 }; 727 };
629 renderer_cmd->CopySwitchesFrom(browser_cmd, kSwitchNames, 728 renderer_cmd->CopySwitchesFrom(browser_cmd, kSwitchNames,
630 arraysize(kSwitchNames)); 729 arraysize(kSwitchNames));
631 730
632 // Disable databases in incognito mode. 731 // Disable databases in incognito mode.
633 if (browser_context()->IsOffTheRecord() && 732 if (GetBrowserContext()->IsOffTheRecord() &&
634 !browser_cmd.HasSwitch(switches::kDisableDatabases)) { 733 !browser_cmd.HasSwitch(switches::kDisableDatabases)) {
635 renderer_cmd->AppendSwitch(switches::kDisableDatabases); 734 renderer_cmd->AppendSwitch(switches::kDisableDatabases);
636 } 735 }
637 } 736 }
638 737
639 base::ProcessHandle BrowserRenderProcessHost::GetHandle() { 738 base::ProcessHandle RenderProcessHostImpl::GetHandle() {
640 // child_process_launcher_ is null either because we're in single process 739 // child_process_launcher_ is null either because we're in single process
641 // mode, we have done fast termination, or the process has crashed. 740 // mode, we have done fast termination, or the process has crashed.
642 if (run_renderer_in_process() || !child_process_launcher_.get()) 741 if (run_renderer_in_process() || !child_process_launcher_.get())
643 return base::Process::Current().handle(); 742 return base::Process::Current().handle();
644 743
645 if (child_process_launcher_->IsStarting()) 744 if (child_process_launcher_->IsStarting())
646 return base::kNullProcessHandle; 745 return base::kNullProcessHandle;
647 746
648 return child_process_launcher_->GetHandle(); 747 return child_process_launcher_->GetHandle();
649 } 748 }
650 749
651 bool BrowserRenderProcessHost::FastShutdownIfPossible() { 750 bool RenderProcessHostImpl::FastShutdownIfPossible() {
652 if (run_renderer_in_process()) 751 if (run_renderer_in_process())
653 return false; // Single process mode can't do fast shutdown. 752 return false; // Single process mode can't do fast shutdown.
654 753
655 if (!content::GetContentClient()->browser()->IsFastShutdownPossible()) 754 if (!content::GetContentClient()->browser()->IsFastShutdownPossible())
656 return false; 755 return false;
657 756
658 if (!child_process_launcher_.get() || 757 if (!child_process_launcher_.get() ||
659 child_process_launcher_->IsStarting() || 758 child_process_launcher_->IsStarting() ||
660 !GetHandle()) 759 !GetHandle())
661 return false; // Render process hasn't started or is probably crashed. 760 return false; // Render process hasn't started or is probably crashed.
662 761
663 // Test if there's an unload listener. 762 // Test if there's an unload listener.
664 // NOTE: It's possible that an onunload listener may be installed 763 // NOTE: It's possible that an onunload listener may be installed
665 // while we're shutting down, so there's a small race here. Given that 764 // while we're shutting down, so there's a small race here. Given that
666 // the window is small, it's unlikely that the web page has much 765 // the window is small, it's unlikely that the web page has much
667 // state that will be lost by not calling its unload handlers properly. 766 // state that will be lost by not calling its unload handlers properly.
668 if (!sudden_termination_allowed()) 767 if (!SuddenTerminationAllowed())
669 return false; 768 return false;
670 769
671 // Store the handle before it gets changed. 770 // Store the handle before it gets changed.
672 base::ProcessHandle handle = GetHandle(); 771 base::ProcessHandle handle = GetHandle();
673 ProcessDied(handle, base::TERMINATION_STATUS_NORMAL_TERMINATION, 0, false); 772 ProcessDied(handle, base::TERMINATION_STATUS_NORMAL_TERMINATION, 0, false);
674 fast_shutdown_started_ = true; 773 fast_shutdown_started_ = true;
675 return true; 774 return true;
676 } 775 }
677 776
678 void BrowserRenderProcessHost::DumpHandles() { 777 void RenderProcessHostImpl::DumpHandles() {
679 #if defined(OS_WIN) 778 #if defined(OS_WIN)
680 Send(new ChildProcessMsg_DumpHandles()); 779 Send(new ChildProcessMsg_DumpHandles());
681 return; 780 return;
682 #endif 781 #endif
683 782
684 NOTIMPLEMENTED(); 783 NOTIMPLEMENTED();
685 } 784 }
686 785
687 // This is a platform specific function for mapping a transport DIB given its id 786 // This is a platform specific function for mapping a transport DIB given its id
688 TransportDIB* BrowserRenderProcessHost::MapTransportDIB( 787 TransportDIB* RenderProcessHostImpl::MapTransportDIB(
689 TransportDIB::Id dib_id) { 788 TransportDIB::Id dib_id) {
690 #if defined(OS_WIN) 789 #if defined(OS_WIN)
691 // On Windows we need to duplicate the handle from the remote process 790 // On Windows we need to duplicate the handle from the remote process
692 HANDLE section = chrome::GetSectionFromProcess( 791 HANDLE section = chrome::GetSectionFromProcess(
693 dib_id.handle, GetHandle(), false /* read write */); 792 dib_id.handle, GetHandle(), false /* read write */);
694 return TransportDIB::Map(section); 793 return TransportDIB::Map(section);
695 #elif defined(OS_MACOSX) 794 #elif defined(OS_MACOSX)
696 // On OSX, the browser allocates all DIBs and keeps a file descriptor around 795 // On OSX, the browser allocates all DIBs and keeps a file descriptor around
697 // for each. 796 // for each.
698 return widget_helper_->MapTransportDIB(dib_id); 797 return widget_helper_->MapTransportDIB(dib_id);
699 #elif defined(OS_POSIX) 798 #elif defined(OS_POSIX)
700 return TransportDIB::Map(dib_id.shmkey); 799 return TransportDIB::Map(dib_id.shmkey);
701 #endif // defined(OS_POSIX) 800 #endif // defined(OS_POSIX)
702 } 801 }
703 802
704 TransportDIB* BrowserRenderProcessHost::GetTransportDIB( 803 TransportDIB* RenderProcessHostImpl::GetTransportDIB(
705 TransportDIB::Id dib_id) { 804 TransportDIB::Id dib_id) {
706 if (!TransportDIB::is_valid_id(dib_id)) 805 if (!TransportDIB::is_valid_id(dib_id))
707 return NULL; 806 return NULL;
708 807
709 const std::map<TransportDIB::Id, TransportDIB*>::iterator 808 const std::map<TransportDIB::Id, TransportDIB*>::iterator
710 i = cached_dibs_.find(dib_id); 809 i = cached_dibs_.find(dib_id);
711 if (i != cached_dibs_.end()) { 810 if (i != cached_dibs_.end()) {
712 cached_dibs_cleaner_.Reset(); 811 cached_dibs_cleaner_.Reset();
713 return i->second; 812 return i->second;
714 } 813 }
(...skipping 17 matching lines...) Expand all
732 831
733 delete smallest_iterator->second; 832 delete smallest_iterator->second;
734 cached_dibs_.erase(smallest_iterator); 833 cached_dibs_.erase(smallest_iterator);
735 } 834 }
736 835
737 cached_dibs_[dib_id] = dib; 836 cached_dibs_[dib_id] = dib;
738 cached_dibs_cleaner_.Reset(); 837 cached_dibs_cleaner_.Reset();
739 return dib; 838 return dib;
740 } 839 }
741 840
742 void BrowserRenderProcessHost::ClearTransportDIBCache() { 841 void RenderProcessHostImpl::ClearTransportDIBCache() {
743 STLDeleteContainerPairSecondPointers( 842 STLDeleteContainerPairSecondPointers(
744 cached_dibs_.begin(), cached_dibs_.end()); 843 cached_dibs_.begin(), cached_dibs_.end());
745 cached_dibs_.clear(); 844 cached_dibs_.clear();
746 } 845 }
747 846
748 void BrowserRenderProcessHost::SetCompositingSurface( 847 void RenderProcessHostImpl::SetCompositingSurface(
749 int render_widget_id, 848 int render_widget_id,
750 gfx::PluginWindowHandle compositing_surface) { 849 gfx::PluginWindowHandle compositing_surface) {
751 widget_helper_->SetCompositingSurface(render_widget_id, compositing_surface); 850 widget_helper_->SetCompositingSurface(render_widget_id, compositing_surface);
752 } 851 }
753 852
754 bool BrowserRenderProcessHost::Send(IPC::Message* msg) { 853 bool RenderProcessHostImpl::Send(IPC::Message* msg) {
755 if (!channel_.get()) { 854 if (!channel_.get()) {
756 if (!is_initialized_) { 855 if (!is_initialized_) {
757 queued_messages_.push(msg); 856 queued_messages_.push(msg);
758 return true; 857 return true;
759 } else { 858 } else {
760 delete msg; 859 delete msg;
761 return false; 860 return false;
762 } 861 }
763 } 862 }
764 863
765 if (child_process_launcher_.get() && child_process_launcher_->IsStarting()) { 864 if (child_process_launcher_.get() && child_process_launcher_->IsStarting()) {
766 queued_messages_.push(msg); 865 queued_messages_.push(msg);
767 return true; 866 return true;
768 } 867 }
769 868
770 return channel_->Send(msg); 869 return channel_->Send(msg);
771 } 870 }
772 871
773 bool BrowserRenderProcessHost::OnMessageReceived(const IPC::Message& msg) { 872 bool RenderProcessHostImpl::OnMessageReceived(const IPC::Message& msg) {
774 // If we're about to be deleted, or have initiated the fast shutdown sequence, 873 // If we're about to be deleted, or have initiated the fast shutdown sequence,
775 // we ignore incoming messages. 874 // we ignore incoming messages.
776 875
777 if (deleting_soon_ || fast_shutdown_started_) 876 if (deleting_soon_ || fast_shutdown_started_)
778 return false; 877 return false;
779 878
780 mark_child_process_activity_time(); 879 mark_child_process_activity_time();
781 if (msg.routing_id() == MSG_ROUTING_CONTROL) { 880 if (msg.routing_id() == MSG_ROUTING_CONTROL) {
782 // Dispatch control messages. 881 // Dispatch control messages.
783 bool msg_is_ok = true; 882 bool msg_is_ok = true;
784 IPC_BEGIN_MESSAGE_MAP_EX(BrowserRenderProcessHost, msg, msg_is_ok) 883 IPC_BEGIN_MESSAGE_MAP_EX(RenderProcessHostImpl, msg, msg_is_ok)
785 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ShutdownRequest, 884 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ShutdownRequest,
786 OnShutdownRequest) 885 OnShutdownRequest)
787 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DumpHandlesDone, 886 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DumpHandlesDone,
788 OnDumpHandlesDone) 887 OnDumpHandlesDone)
789 IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged, 888 IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged,
790 SuddenTerminationChanged) 889 SuddenTerminationChanged)
791 IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction, 890 IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction,
792 OnUserMetricsRecordAction) 891 OnUserMetricsRecordAction)
793 IPC_MESSAGE_HANDLER(ViewHostMsg_RevealFolderInOS, OnRevealFolderInOS) 892 IPC_MESSAGE_HANDLER(ViewHostMsg_RevealFolderInOS, OnRevealFolderInOS)
794 IPC_MESSAGE_HANDLER(ViewHostMsg_SavedPageAsMHTML, OnSavedPageAsMHTML) 893 IPC_MESSAGE_HANDLER(ViewHostMsg_SavedPageAsMHTML, OnSavedPageAsMHTML)
(...skipping 18 matching lines...) Expand all
813 // hang waiting for a reply. 912 // hang waiting for a reply.
814 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); 913 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
815 reply->set_reply_error(); 914 reply->set_reply_error();
816 Send(reply); 915 Send(reply);
817 } 916 }
818 return true; 917 return true;
819 } 918 }
820 return listener->OnMessageReceived(msg); 919 return listener->OnMessageReceived(msg);
821 } 920 }
822 921
823 void BrowserRenderProcessHost::OnChannelConnected(int32 peer_pid) { 922 void RenderProcessHostImpl::OnChannelConnected(int32 peer_pid) {
824 #if defined(IPC_MESSAGE_LOG_ENABLED) 923 #if defined(IPC_MESSAGE_LOG_ENABLED)
825 Send(new ChildProcessMsg_SetIPCLoggingEnabled( 924 Send(new ChildProcessMsg_SetIPCLoggingEnabled(
826 IPC::Logging::GetInstance()->Enabled())); 925 IPC::Logging::GetInstance()->Enabled()));
827 #endif 926 #endif
828 927
829 // Make sure the child checks with us before exiting, so that we do not try 928 // Make sure the child checks with us before exiting, so that we do not try
830 // to schedule a new navigation in a swapped out and exiting renderer. 929 // to schedule a new navigation in a swapped out and exiting renderer.
831 Send(new ChildProcessMsg_AskBeforeShutdown()); 930 Send(new ChildProcessMsg_AskBeforeShutdown());
832 } 931 }
833 932
834 void BrowserRenderProcessHost::OnChannelError() { 933 void RenderProcessHostImpl::OnChannelError() {
835 if (!channel_.get()) 934 if (!channel_.get())
836 return; 935 return;
837 936
838 // Store the handle before it gets changed. 937 // Store the handle before it gets changed.
839 base::ProcessHandle handle = GetHandle(); 938 base::ProcessHandle handle = GetHandle();
840 939
841 // child_process_launcher_ can be NULL in single process mode or if fast 940 // child_process_launcher_ can be NULL in single process mode or if fast
842 // termination happened. 941 // termination happened.
843 int exit_code = 0; 942 int exit_code = 0;
844 base::TerminationStatus status = 943 base::TerminationStatus status =
845 child_process_launcher_.get() ? 944 child_process_launcher_.get() ?
846 child_process_launcher_->GetChildTerminationStatus(&exit_code) : 945 child_process_launcher_->GetChildTerminationStatus(&exit_code) :
847 base::TERMINATION_STATUS_NORMAL_TERMINATION; 946 base::TERMINATION_STATUS_NORMAL_TERMINATION;
848 947
849 #if defined(OS_WIN) 948 #if defined(OS_WIN)
850 if (!run_renderer_in_process()) { 949 if (!run_renderer_in_process()) {
851 if (status == base::TERMINATION_STATUS_STILL_RUNNING) { 950 if (status == base::TERMINATION_STATUS_STILL_RUNNING) {
852 HANDLE process = child_process_launcher_->GetHandle(); 951 HANDLE process = child_process_launcher_->GetHandle();
853 child_process_watcher_.StartWatching( 952 child_process_watcher_.StartWatching(
854 new base::WaitableEvent(process), this); 953 new base::WaitableEvent(process), this);
855 return; 954 return;
856 } 955 }
857 } 956 }
858 #endif 957 #endif
859 ProcessDied(handle, status, exit_code, false); 958 ProcessDied(handle, status, exit_code, false);
860 } 959 }
861 960
862 // Called when the renderer process handle has been signaled. 961 // Called when the renderer process handle has been signaled.
863 void BrowserRenderProcessHost::OnWaitableEventSignaled( 962 void RenderProcessHostImpl::OnWaitableEventSignaled(
864 base::WaitableEvent* waitable_event) { 963 base::WaitableEvent* waitable_event) {
865 #if defined (OS_WIN) 964 #if defined (OS_WIN)
866 base::ProcessHandle handle = GetHandle(); 965 base::ProcessHandle handle = GetHandle();
867 int exit_code = 0; 966 int exit_code = 0;
868 base::TerminationStatus status = 967 base::TerminationStatus status =
869 base::GetTerminationStatus(waitable_event->Release(), &exit_code); 968 base::GetTerminationStatus(waitable_event->Release(), &exit_code);
870 delete waitable_event; 969 delete waitable_event;
871 ProcessDied(handle, status, exit_code, true); 970 ProcessDied(handle, status, exit_code, true);
872 #endif 971 #endif
873 } 972 }
874 973
875 void BrowserRenderProcessHost::ProcessDied(base::ProcessHandle handle, 974 content::BrowserContext* RenderProcessHostImpl::GetBrowserContext() const {
975 return browser_context_;
976 }
977
978 int RenderProcessHostImpl::GetID() const {
979 return id_;
980 }
981
982 bool RenderProcessHostImpl::HasConnection() const {
983 return channel_.get() != NULL;
984 }
985
986 IPC::Channel::Listener* RenderProcessHostImpl::GetListenerByID(
987 int routing_id) {
988 return listeners_.Lookup(routing_id);
989 }
990
991 void RenderProcessHostImpl::SetIgnoreInputEvents(bool ignore_input_events) {
992 ignore_input_events_ = ignore_input_events;
993 }
994
995 bool RenderProcessHostImpl::IgnoreInputEvents() const {
996 return ignore_input_events_;
997 }
998
999 void RenderProcessHostImpl::Attach(IPC::Channel::Listener* listener,
1000 int routing_id) {
1001 listeners_.AddWithID(listener, routing_id);
1002 }
1003
1004 void RenderProcessHostImpl::Release(int listener_id) {
1005 DCHECK(listeners_.Lookup(listener_id) != NULL);
1006 listeners_.Remove(listener_id);
1007
1008 // Make sure that all associated resource requests are stopped.
1009 CancelResourceRequests(listener_id);
1010
1011 #if defined(OS_WIN)
1012 // Dump the handle table if handle auditing is enabled.
1013 const CommandLine& browser_command_line =
1014 *CommandLine::ForCurrentProcess();
1015 if (browser_command_line.HasSwitch(switches::kAuditHandles) ||
1016 browser_command_line.HasSwitch(switches::kAuditAllHandles)) {
1017 DumpHandles();
1018
1019 // We wait to close the channels until the child process has finished
1020 // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone.
1021 return;
1022 }
1023 #endif
1024 Cleanup();
1025 }
1026
1027 void RenderProcessHostImpl::Cleanup() {
1028 // When no other owners of this object, we can delete ourselves
1029 if (listeners_.IsEmpty()) {
1030 content::NotificationService::current()->Notify(
1031 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
1032 content::Source<RenderProcessHost>(this),
1033 content::NotificationService::NoDetails());
1034 MessageLoop::current()->DeleteSoon(FROM_HERE, this);
1035 deleting_soon_ = true;
1036 // It's important not to wait for the DeleteTask to delete the channel
1037 // proxy. Kill it off now. That way, in case the profile is going away, the
1038 // rest of the objects attached to this RenderProcessHost start going
1039 // away first, since deleting the channel proxy will post a
1040 // OnChannelClosed() to IPC::ChannelProxy::Context on the IO thread.
1041 channel_.reset();
1042
1043 // Remove ourself from the list of renderer processes so that we can't be
1044 // reused in between now and when the Delete task runs.
1045 g_all_hosts.Get().Remove(GetID());
1046 }
1047 }
1048
1049 void RenderProcessHostImpl::ReportExpectingClose(int32 listener_id) {
1050 listeners_expecting_close_.insert(listener_id);
1051 }
1052
1053 void RenderProcessHostImpl::AddPendingView() {
1054 pending_views_++;
1055 }
1056
1057 void RenderProcessHostImpl::RemovePendingView() {
1058 DCHECK(pending_views_);
1059 pending_views_--;
1060 }
1061
1062 void RenderProcessHostImpl::UpdateMaxPageID(int32 page_id) {
1063 if (page_id > max_page_id_)
1064 max_page_id_ = page_id;
1065 }
1066
1067 void RenderProcessHostImpl::SetSuddenTerminationAllowed(bool enabled) {
1068 sudden_termination_allowed_ = enabled;
1069 }
1070
1071 bool RenderProcessHostImpl::SuddenTerminationAllowed() const {
1072 return sudden_termination_allowed_;
1073 }
1074
1075 IPC::ChannelProxy* RenderProcessHostImpl::GetChannel() {
1076 return channel_.get();
1077 }
1078
1079 RenderProcessHost::listeners_iterator
1080 RenderProcessHostImpl::ListenersIterator() {
1081 return listeners_iterator(&listeners_);
1082 }
1083
1084 bool RenderProcessHostImpl::FastShutdownForPageCount(size_t count) {
1085 if (listeners_.size() == count)
1086 return FastShutdownIfPossible();
1087 return false;
1088 }
1089
1090 bool RenderProcessHostImpl::FastShutdownStarted() const {
1091 return fast_shutdown_started_;
1092 }
1093
1094 // static
1095 bool RenderProcessHost::run_renderer_in_process() {
1096 return g_run_renderer_in_process_;
1097 }
1098
1099 void RenderProcessHost::set_run_renderer_in_process(bool value) {
1100 g_run_renderer_in_process_ = value;
1101 }
1102
1103 RenderProcessHost::iterator RenderProcessHost::AllHostsIterator() {
1104 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1105 return iterator(g_all_hosts.Pointer());
1106 }
1107
1108 // static
1109 RenderProcessHost* RenderProcessHost::FromID(int render_process_id) {
1110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1111 return g_all_hosts.Get().Lookup(render_process_id);
1112 }
1113
1114 // static
1115 bool RenderProcessHost::ShouldTryToUseExistingProcessHost() {
1116 size_t renderer_process_count = g_all_hosts.Get().size();
1117
1118 // NOTE: Sometimes it's necessary to create more render processes than
1119 // GetMaxRendererProcessCount(), for instance when we want to create
1120 // a renderer process for a browser context that has no existing
1121 // renderers. This is OK in moderation, since the
1122 // GetMaxRendererProcessCount() is conservative.
1123
1124 return run_renderer_in_process() ||
1125 (renderer_process_count >= GetMaxRendererProcessCount());
1126 }
1127
1128 // static
1129 RenderProcessHost* RenderProcessHost::GetExistingProcessHost(
1130 content::BrowserContext* browser_context,
1131 const GURL& site_url) {
1132 // First figure out which existing renderers we can use.
1133 std::vector<RenderProcessHost*> suitable_renderers;
1134 suitable_renderers.reserve(g_all_hosts.Get().size());
1135
1136 iterator iter(AllHostsIterator());
1137 while (!iter.IsAtEnd()) {
1138 if (run_renderer_in_process() ||
1139 IsSuitableHost(
1140 iter.GetCurrentValue(),
1141 browser_context, site_url))
1142 suitable_renderers.push_back(iter.GetCurrentValue());
1143
1144 iter.Advance();
1145 }
1146
1147 // Now pick a random suitable renderer, if we have any.
1148 if (!suitable_renderers.empty()) {
1149 int suitable_count = static_cast<int>(suitable_renderers.size());
1150 int random_index = base::RandInt(0, suitable_count - 1);
1151 return suitable_renderers[random_index];
1152 }
1153
1154 return NULL;
1155 }
1156
1157 void RenderProcessHostImpl::ProcessDied(base::ProcessHandle handle,
876 base::TerminationStatus status, 1158 base::TerminationStatus status,
877 int exit_code, 1159 int exit_code,
878 bool was_alive) { 1160 bool was_alive) {
879 // Our child process has died. If we didn't expect it, it's a crash. 1161 // Our child process has died. If we didn't expect it, it's a crash.
880 // In any case, we need to let everyone know it's gone. 1162 // In any case, we need to let everyone know it's gone.
881 // The OnChannelError notification can fire multiple times due to nested sync 1163 // The OnChannelError notification can fire multiple times due to nested sync
882 // calls to a renderer. If we don't have a valid channel here it means we 1164 // calls to a renderer. If we don't have a valid channel here it means we
883 // already handled the error. 1165 // already handled the error.
884 1166
885 RendererClosedDetails details(handle, status, exit_code, was_alive); 1167 RendererClosedDetails details(handle, status, exit_code, was_alive);
(...skipping 13 matching lines...) Expand all
899 exit_code)); 1181 exit_code));
900 iter.Advance(); 1182 iter.Advance();
901 } 1183 }
902 1184
903 ClearTransportDIBCache(); 1185 ClearTransportDIBCache();
904 1186
905 // this object is not deleted at this point and may be reused later. 1187 // this object is not deleted at this point and may be reused later.
906 // TODO(darin): clean this up 1188 // TODO(darin): clean this up
907 } 1189 }
908 1190
909 void BrowserRenderProcessHost::OnShutdownRequest() { 1191 void RenderProcessHostImpl::OnShutdownRequest() {
910 // Don't shutdown if there are pending RenderViews being swapped back in. 1192 // Don't shutdown if there are pending RenderViews being swapped back in.
911 if (pending_views_) 1193 if (pending_views_)
912 return; 1194 return;
913 1195
914 // Notify any tabs that might have swapped out renderers from this process. 1196 // Notify any tabs that might have swapped out renderers from this process.
915 // They should not attempt to swap them back in. 1197 // They should not attempt to swap them back in.
916 content::NotificationService::current()->Notify( 1198 content::NotificationService::current()->Notify(
917 content::NOTIFICATION_RENDERER_PROCESS_CLOSING, 1199 content::NOTIFICATION_RENDERER_PROCESS_CLOSING,
918 content::Source<RenderProcessHost>(this), 1200 content::Source<RenderProcessHost>(this),
919 content::NotificationService::NoDetails()); 1201 content::NotificationService::NoDetails());
920 1202
921 Send(new ChildProcessMsg_Shutdown()); 1203 Send(new ChildProcessMsg_Shutdown());
922 } 1204 }
923 1205
924 void BrowserRenderProcessHost::OnDumpHandlesDone() { 1206 void RenderProcessHostImpl::SuddenTerminationChanged(bool enabled) {
1207 SetSuddenTerminationAllowed(enabled);
1208 }
1209
1210 void RenderProcessHostImpl::OnDumpHandlesDone() {
925 Cleanup(); 1211 Cleanup();
926 } 1212 }
927 1213
928 void BrowserRenderProcessHost::SuddenTerminationChanged(bool enabled) { 1214 void RenderProcessHostImpl::SetBackgrounded(bool backgrounded) {
929 set_sudden_termination_allowed(enabled);
930 }
931
932 void BrowserRenderProcessHost::SetBackgrounded(bool backgrounded) {
933 // Note: we always set the backgrounded_ value. If the process is NULL 1215 // Note: we always set the backgrounded_ value. If the process is NULL
934 // (and hence hasn't been created yet), we will set the process priority 1216 // (and hence hasn't been created yet), we will set the process priority
935 // later when we create the process. 1217 // later when we create the process.
936 backgrounded_ = backgrounded; 1218 backgrounded_ = backgrounded;
937 if (!child_process_launcher_.get() || child_process_launcher_->IsStarting()) 1219 if (!child_process_launcher_.get() || child_process_launcher_->IsStarting())
938 return; 1220 return;
939 1221
940 #if defined(OS_WIN) 1222 #if defined(OS_WIN)
941 // The cbstext.dll loads as a global GetMessage hook in the browser process 1223 // The cbstext.dll loads as a global GetMessage hook in the browser process
942 // and intercepts/unintercepts the kernel32 API SetPriorityClass in a 1224 // and intercepts/unintercepts the kernel32 API SetPriorityClass in a
943 // background thread. If the UI thread invokes this API just when it is 1225 // background thread. If the UI thread invokes this API just when it is
944 // intercepted the stack is messed up on return from the interceptor 1226 // intercepted the stack is messed up on return from the interceptor
945 // which causes random crashes in the browser process. Our hack for now 1227 // which causes random crashes in the browser process. Our hack for now
946 // is to not invoke the SetPriorityClass API if the dll is loaded. 1228 // is to not invoke the SetPriorityClass API if the dll is loaded.
947 if (GetModuleHandle(L"cbstext.dll")) 1229 if (GetModuleHandle(L"cbstext.dll"))
948 return; 1230 return;
949 #endif // OS_WIN 1231 #endif // OS_WIN
950 1232
951 child_process_launcher_->SetProcessBackgrounded(backgrounded); 1233 child_process_launcher_->SetProcessBackgrounded(backgrounded);
952 } 1234 }
953 1235
954 void BrowserRenderProcessHost::OnProcessLaunched() { 1236 void RenderProcessHostImpl::OnProcessLaunched() {
955 // No point doing anything, since this object will be destructed soon. We 1237 // No point doing anything, since this object will be destructed soon. We
956 // especially don't want to send the RENDERER_PROCESS_CREATED notification, 1238 // especially don't want to send the RENDERER_PROCESS_CREATED notification,
957 // since some clients might expect a RENDERER_PROCESS_TERMINATED afterwards to 1239 // since some clients might expect a RENDERER_PROCESS_TERMINATED afterwards to
958 // properly cleanup. 1240 // properly cleanup.
959 if (deleting_soon_) 1241 if (deleting_soon_)
960 return; 1242 return;
961 1243
962 if (child_process_launcher_.get()) { 1244 if (child_process_launcher_.get()) {
963 if (!child_process_launcher_->GetHandle()) { 1245 if (!child_process_launcher_->GetHandle()) {
964 OnChannelError(); 1246 OnChannelError();
(...skipping 17 matching lines...) Expand all
982 content::NOTIFICATION_RENDERER_PROCESS_CREATED, 1264 content::NOTIFICATION_RENDERER_PROCESS_CREATED,
983 content::Source<RenderProcessHost>(this), 1265 content::Source<RenderProcessHost>(this),
984 content::NotificationService::NoDetails()); 1266 content::NotificationService::NoDetails());
985 1267
986 while (!queued_messages_.empty()) { 1268 while (!queued_messages_.empty()) {
987 Send(queued_messages_.front()); 1269 Send(queued_messages_.front());
988 queued_messages_.pop(); 1270 queued_messages_.pop();
989 } 1271 }
990 } 1272 }
991 1273
992 void BrowserRenderProcessHost::OnUserMetricsRecordAction( 1274 void RenderProcessHostImpl::OnUserMetricsRecordAction(
993 const std::string& action) { 1275 const std::string& action) {
994 UserMetrics::RecordComputedAction(action); 1276 UserMetrics::RecordComputedAction(action);
995 } 1277 }
996 1278
997 void BrowserRenderProcessHost::OnRevealFolderInOS(const FilePath& path) { 1279 void RenderProcessHostImpl::OnRevealFolderInOS(const FilePath& path) {
998 // Only honor the request if appropriate persmissions are granted. 1280 // Only honor the request if appropriate persmissions are granted.
999 if (ChildProcessSecurityPolicy::GetInstance()->CanReadFile(id(), path)) 1281 if (ChildProcessSecurityPolicy::GetInstance()->CanReadFile(GetID(), path))
1000 content::GetContentClient()->browser()->OpenItem(path); 1282 content::GetContentClient()->browser()->OpenItem(path);
1001 } 1283 }
1002 1284
1003 void BrowserRenderProcessHost::OnSavedPageAsMHTML(int job_id, int64 data_size) { 1285 void RenderProcessHostImpl::OnSavedPageAsMHTML(int job_id, int64 data_size) {
1004 content::GetContentClient()->browser()->GetMHTMLGenerationManager()-> 1286 content::GetContentClient()->browser()->GetMHTMLGenerationManager()->
1005 MHTMLGenerated(job_id, data_size); 1287 MHTMLGenerated(job_id, data_size);
1006 } 1288 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698