| OLD | NEW |
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-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 "build/build_config.h" | 10 #include "build/build_config.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 #include "chrome/common/result_codes.h" | 56 #include "chrome/common/result_codes.h" |
| 57 #include "chrome/renderer/render_process.h" | 57 #include "chrome/renderer/render_process.h" |
| 58 #include "chrome/renderer/render_thread.h" | 58 #include "chrome/renderer/render_thread.h" |
| 59 #include "chrome/installer/util/google_update_settings.h" | 59 #include "chrome/installer/util/google_update_settings.h" |
| 60 #include "grit/generated_resources.h" | 60 #include "grit/generated_resources.h" |
| 61 #include "ipc/ipc_switches.h" | 61 #include "ipc/ipc_switches.h" |
| 62 | 62 |
| 63 #if defined(OS_WIN) | 63 #if defined(OS_WIN) |
| 64 #include "app/win_util.h" | 64 #include "app/win_util.h" |
| 65 #include "chrome/browser/sandbox_policy.h" | 65 #include "chrome/browser/sandbox_policy.h" |
| 66 #elif defined(OS_LINUX) | 66 #elif defined(OS_LINUX) || defined(OS_FREEBSD) |
| 67 #include "base/linux_util.h" | 67 #include "base/linux_util.h" |
| 68 #include "chrome/browser/zygote_host_linux.h" | 68 #include "chrome/browser/zygote_host_linux.h" |
| 69 #include "chrome/browser/renderer_host/render_crash_handler_host_linux.h" | 69 #include "chrome/browser/renderer_host/render_crash_handler_host_linux.h" |
| 70 #include "chrome/browser/renderer_host/render_sandbox_host_linux.h" | 70 #include "chrome/browser/renderer_host/render_sandbox_host_linux.h" |
| 71 #endif | 71 #endif |
| 72 | 72 |
| 73 using WebKit::WebCache; | 73 using WebKit::WebCache; |
| 74 | 74 |
| 75 #include "third_party/skia/include/core/SkBitmap.h" | 75 #include "third_party/skia/include/core/SkBitmap.h" |
| 76 | 76 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 | 231 |
| 232 // We may have some unsent messages at this point, but that's OK. | 232 // We may have some unsent messages at this point, but that's OK. |
| 233 channel_.reset(); | 233 channel_.reset(); |
| 234 | 234 |
| 235 // Destroy the AudioRendererHost properly. | 235 // Destroy the AudioRendererHost properly. |
| 236 if (audio_renderer_host_.get()) | 236 if (audio_renderer_host_.get()) |
| 237 audio_renderer_host_->Destroy(); | 237 audio_renderer_host_->Destroy(); |
| 238 | 238 |
| 239 if (process_.handle() && !run_renderer_in_process()) { | 239 if (process_.handle() && !run_renderer_in_process()) { |
| 240 if (zygote_child_) { | 240 if (zygote_child_) { |
| 241 #if defined(OS_LINUX) | 241 #if defined(OS_LINUX) || defined(OS_FREEBSD) |
| 242 Singleton<ZygoteHost>()->EnsureProcessTerminated(process_.handle()); | 242 Singleton<ZygoteHost>()->EnsureProcessTerminated(process_.handle()); |
| 243 #endif | 243 #endif |
| 244 } else { | 244 } else { |
| 245 ProcessWatcher::EnsureProcessTerminated(process_.handle()); | 245 ProcessWatcher::EnsureProcessTerminated(process_.handle()); |
| 246 } | 246 } |
| 247 } | 247 } |
| 248 | 248 |
| 249 ClearTransportDIBCache(); | 249 ClearTransportDIBCache(); |
| 250 } | 250 } |
| 251 | 251 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 if (run_renderer_in_process()) { | 390 if (run_renderer_in_process()) { |
| 391 // Crank up a thread and run the initialization there. With the way that | 391 // Crank up a thread and run the initialization there. With the way that |
| 392 // messages flow between the browser and renderer, this thread is required | 392 // messages flow between the browser and renderer, this thread is required |
| 393 // to prevent a deadlock in single-process mode. Since the primordial | 393 // to prevent a deadlock in single-process mode. Since the primordial |
| 394 // thread in the renderer process runs the WebKit code and can sometimes | 394 // thread in the renderer process runs the WebKit code and can sometimes |
| 395 // make blocking calls to the UI thread (i.e. this thread), they need to run | 395 // make blocking calls to the UI thread (i.e. this thread), they need to run |
| 396 // on separate threads. | 396 // on separate threads. |
| 397 in_process_renderer_.reset(new RendererMainThread(channel_id)); | 397 in_process_renderer_.reset(new RendererMainThread(channel_id)); |
| 398 | 398 |
| 399 base::Thread::Options options; | 399 base::Thread::Options options; |
| 400 #if !defined(OS_LINUX) | 400 #if !defined(USE_X11) |
| 401 // In-process plugins require this to be a UI message loop. | 401 // In-process plugins require this to be a UI message loop. |
| 402 options.message_loop_type = MessageLoop::TYPE_UI; | 402 options.message_loop_type = MessageLoop::TYPE_UI; |
| 403 #else | 403 #else |
| 404 // We can't have multiple UI loops on Linux, so we don't support | 404 // We can't have multiple UI loops on X, so we don't support |
| 405 // in-process plugins. | 405 // in-process plugins. |
| 406 options.message_loop_type = MessageLoop::TYPE_DEFAULT; | 406 options.message_loop_type = MessageLoop::TYPE_DEFAULT; |
| 407 #endif | 407 #endif |
| 408 in_process_renderer_->StartWithOptions(options); | 408 in_process_renderer_->StartWithOptions(options); |
| 409 } else { | 409 } else { |
| 410 base::ProcessHandle process = 0; | 410 base::ProcessHandle process = 0; |
| 411 #if defined(OS_WIN) | 411 #if defined(OS_WIN) |
| 412 process = sandbox::StartProcess(&cmd_line); | 412 process = sandbox::StartProcess(&cmd_line); |
| 413 #elif defined(OS_POSIX) | 413 #elif defined(OS_POSIX) |
| 414 #if defined(OS_LINUX) | 414 #if defined(OS_LINUX) || defined(OS_FREEBSD) |
| 415 if (!has_cmd_prefix) { | 415 if (!has_cmd_prefix) { |
| 416 base::GlobalDescriptors::Mapping mapping; | 416 base::GlobalDescriptors::Mapping mapping; |
| 417 const int ipcfd = channel_->GetClientFileDescriptor(); | 417 const int ipcfd = channel_->GetClientFileDescriptor(); |
| 418 mapping.push_back(std::pair<uint32_t, int>(kPrimaryIPCChannel, ipcfd)); | 418 mapping.push_back(std::pair<uint32_t, int>(kPrimaryIPCChannel, ipcfd)); |
| 419 const int crash_signal_fd = | 419 const int crash_signal_fd = |
| 420 Singleton<RenderCrashHandlerHostLinux>()->GetDeathSignalSocket(); | 420 Singleton<RenderCrashHandlerHostLinux>()->GetDeathSignalSocket(); |
| 421 if (crash_signal_fd >= 0) { | 421 if (crash_signal_fd >= 0) { |
| 422 mapping.push_back(std::pair<uint32_t, int>(kCrashDumpSignal, | 422 mapping.push_back(std::pair<uint32_t, int>(kCrashDumpSignal, |
| 423 crash_signal_fd)); | 423 crash_signal_fd)); |
| 424 } | 424 } |
| 425 process = Singleton<ZygoteHost>()->ForkRenderer(cmd_line.argv(), mapping); | 425 process = Singleton<ZygoteHost>()->ForkRenderer(cmd_line.argv(), mapping); |
| 426 zygote_child_ = true; | 426 zygote_child_ = true; |
| 427 } else { | 427 } else { |
| 428 #endif // defined(OS_LINUX) | 428 #endif // defined(OS_LINUX) |
| 429 // NOTE: This code is duplicated with plugin_process_host.cc, but | 429 // NOTE: This code is duplicated with plugin_process_host.cc, but |
| 430 // there's not a good place to de-duplicate it. | 430 // there's not a good place to de-duplicate it. |
| 431 base::file_handle_mapping_vector fds_to_map; | 431 base::file_handle_mapping_vector fds_to_map; |
| 432 const int ipcfd = channel_->GetClientFileDescriptor(); | 432 const int ipcfd = channel_->GetClientFileDescriptor(); |
| 433 fds_to_map.push_back(std::make_pair(ipcfd, kPrimaryIPCChannel + 3)); | 433 fds_to_map.push_back(std::make_pair(ipcfd, kPrimaryIPCChannel + 3)); |
| 434 #if defined(OS_LINUX) | 434 #if defined(OS_LINUX) || defined(OS_FREEBSD) |
| 435 const int crash_signal_fd = | 435 const int crash_signal_fd = |
| 436 Singleton<RenderCrashHandlerHostLinux>()->GetDeathSignalSocket(); | 436 Singleton<RenderCrashHandlerHostLinux>()->GetDeathSignalSocket(); |
| 437 if (crash_signal_fd >= 0) { | 437 if (crash_signal_fd >= 0) { |
| 438 fds_to_map.push_back(std::make_pair(crash_signal_fd, | 438 fds_to_map.push_back(std::make_pair(crash_signal_fd, |
| 439 kCrashDumpSignal + 3)); | 439 kCrashDumpSignal + 3)); |
| 440 } | 440 } |
| 441 const int sandbox_fd = | 441 const int sandbox_fd = |
| 442 Singleton<RenderSandboxHostLinux>()->GetRendererSocket(); | 442 Singleton<RenderSandboxHostLinux>()->GetRendererSocket(); |
| 443 fds_to_map.push_back(std::make_pair(sandbox_fd, kSandboxIPCChannel + 3)); | 443 fds_to_map.push_back(std::make_pair(sandbox_fd, kSandboxIPCChannel + 3)); |
| 444 #endif // defined(OS_LINUX) | 444 #endif // defined(OS_LINUX) |
| 445 base::LaunchApp(cmd_line.argv(), fds_to_map, false, &process); | 445 base::LaunchApp(cmd_line.argv(), fds_to_map, false, &process); |
| 446 zygote_child_ = false; | 446 zygote_child_ = false; |
| 447 #if defined(OS_LINUX) | 447 #if defined(OS_LINUX) || defined(OS_FREEBSD) |
| 448 } | 448 } |
| 449 #endif // defined(OS_LINUX) | 449 #endif // defined(OS_LINUX) |
| 450 #endif // defined(OS_WIN) | 450 #endif // defined(OS_WIN) |
| 451 | 451 |
| 452 if (!process) { | 452 if (!process) { |
| 453 channel_.reset(); | 453 channel_.reset(); |
| 454 return false; | 454 return false; |
| 455 } | 455 } |
| 456 process_.set_handle(process); | 456 process_.set_handle(process); |
| 457 } | 457 } |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 TransportDIB::Id dib_id) { | 654 TransportDIB::Id dib_id) { |
| 655 #if defined(OS_WIN) | 655 #if defined(OS_WIN) |
| 656 // On Windows we need to duplicate the handle from the remote process | 656 // On Windows we need to duplicate the handle from the remote process |
| 657 HANDLE section = win_util::GetSectionFromProcess( | 657 HANDLE section = win_util::GetSectionFromProcess( |
| 658 dib_id.handle, GetRendererProcessHandle(), false /* read write */); | 658 dib_id.handle, GetRendererProcessHandle(), false /* read write */); |
| 659 return TransportDIB::Map(section); | 659 return TransportDIB::Map(section); |
| 660 #elif defined(OS_MACOSX) | 660 #elif defined(OS_MACOSX) |
| 661 // On OSX, the browser allocates all DIBs and keeps a file descriptor around | 661 // On OSX, the browser allocates all DIBs and keeps a file descriptor around |
| 662 // for each. | 662 // for each. |
| 663 return widget_helper_->MapTransportDIB(dib_id); | 663 return widget_helper_->MapTransportDIB(dib_id); |
| 664 #elif defined(OS_LINUX) | 664 #elif defined(USE_X11) |
| 665 return TransportDIB::Map(dib_id); | 665 return TransportDIB::Map(dib_id); |
| 666 #endif // defined(OS_LINUX) | 666 #endif // defined(USE_X11) |
| 667 } | 667 } |
| 668 | 668 |
| 669 TransportDIB* BrowserRenderProcessHost::GetTransportDIB( | 669 TransportDIB* BrowserRenderProcessHost::GetTransportDIB( |
| 670 TransportDIB::Id dib_id) { | 670 TransportDIB::Id dib_id) { |
| 671 const std::map<TransportDIB::Id, TransportDIB*>::iterator | 671 const std::map<TransportDIB::Id, TransportDIB*>::iterator |
| 672 i = cached_dibs_.find(dib_id); | 672 i = cached_dibs_.find(dib_id); |
| 673 if (i != cached_dibs_.end()) { | 673 if (i != cached_dibs_.end()) { |
| 674 cached_dibs_cleaner_.Reset(); | 674 cached_dibs_cleaner_.Reset(); |
| 675 return i->second; | 675 return i->second; |
| 676 } | 676 } |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 void BrowserRenderProcessHost::OnChannelError() { | 809 void BrowserRenderProcessHost::OnChannelError() { |
| 810 // Our child process has died. If we didn't expect it, it's a crash. | 810 // Our child process has died. If we didn't expect it, it's a crash. |
| 811 // In any case, we need to let everyone know it's gone. | 811 // In any case, we need to let everyone know it's gone. |
| 812 | 812 |
| 813 DCHECK(process_.handle()); | 813 DCHECK(process_.handle()); |
| 814 DCHECK(channel_.get()); | 814 DCHECK(channel_.get()); |
| 815 | 815 |
| 816 bool child_exited; | 816 bool child_exited; |
| 817 bool did_crash; | 817 bool did_crash; |
| 818 if (zygote_child_) { | 818 if (zygote_child_) { |
| 819 #if defined(OS_LINUX) | 819 #if defined(OS_LINUX) || defined(OS_FREEBSD) |
| 820 did_crash = Singleton<ZygoteHost>()->DidProcessCrash( | 820 did_crash = Singleton<ZygoteHost>()->DidProcessCrash( |
| 821 process_.handle(), &child_exited); | 821 process_.handle(), &child_exited); |
| 822 #else | 822 #else |
| 823 NOTREACHED(); | 823 NOTREACHED(); |
| 824 did_crash = true; | 824 did_crash = true; |
| 825 #endif | 825 #endif |
| 826 } else { | 826 } else { |
| 827 did_crash = base::DidProcessCrash(&child_exited, process_.handle()); | 827 did_crash = base::DidProcessCrash(&child_exited, process_.handle()); |
| 828 } | 828 } |
| 829 | 829 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 959 profile()->GetExtensionMessageService()->RemoveEventListener( | 959 profile()->GetExtensionMessageService()->RemoveEventListener( |
| 960 event_name, id()); | 960 event_name, id()); |
| 961 } | 961 } |
| 962 } | 962 } |
| 963 | 963 |
| 964 void BrowserRenderProcessHost::OnExtensionCloseChannel(int port_id) { | 964 void BrowserRenderProcessHost::OnExtensionCloseChannel(int port_id) { |
| 965 if (profile()->GetExtensionMessageService()) { | 965 if (profile()->GetExtensionMessageService()) { |
| 966 profile()->GetExtensionMessageService()->CloseChannel(port_id); | 966 profile()->GetExtensionMessageService()->CloseChannel(port_id); |
| 967 } | 967 } |
| 968 } | 968 } |
| OLD | NEW |