| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "content/browser/renderer_host/render_view_host_impl.h" | 5 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 #include "content/common/view_messages.h" | 34 #include "content/common/view_messages.h" |
| 35 #include "content/port/browser/render_widget_host_view_port.h" | 35 #include "content/port/browser/render_widget_host_view_port.h" |
| 36 #include "content/public/browser/browser_context.h" | 36 #include "content/public/browser/browser_context.h" |
| 37 #include "content/public/browser/browser_message_filter.h" | 37 #include "content/public/browser/browser_message_filter.h" |
| 38 #include "content/public/browser/content_browser_client.h" | 38 #include "content/public/browser/content_browser_client.h" |
| 39 #include "content/public/browser/dom_operation_notification_details.h" | 39 #include "content/public/browser/dom_operation_notification_details.h" |
| 40 #include "content/public/browser/native_web_keyboard_event.h" | 40 #include "content/public/browser/native_web_keyboard_event.h" |
| 41 #include "content/public/browser/notification_details.h" | 41 #include "content/public/browser/notification_details.h" |
| 42 #include "content/public/browser/notification_service.h" | 42 #include "content/public/browser/notification_service.h" |
| 43 #include "content/public/browser/notification_types.h" | 43 #include "content/public/browser/notification_types.h" |
| 44 #include "content/public/browser/render_process_host.h" | |
| 45 #include "content/public/browser/render_view_host_delegate.h" | 44 #include "content/public/browser/render_view_host_delegate.h" |
| 46 #include "content/public/browser/render_view_host_observer.h" | 45 #include "content/public/browser/render_view_host_observer.h" |
| 47 #include "content/public/browser/user_metrics.h" | 46 #include "content/public/browser/user_metrics.h" |
| 48 #include "content/public/common/bindings_policy.h" | 47 #include "content/public/common/bindings_policy.h" |
| 49 #include "content/public/common/content_constants.h" | 48 #include "content/public/common/content_constants.h" |
| 50 #include "content/public/common/content_switches.h" | 49 #include "content/public/common/content_switches.h" |
| 51 #include "content/public/common/context_menu_params.h" | 50 #include "content/public/common/context_menu_params.h" |
| 52 #include "content/public/common/result_codes.h" | 51 #include "content/public/common/result_codes.h" |
| 53 #include "content/public/common/url_constants.h" | 52 #include "content/public/common/url_constants.h" |
| 54 #include "net/base/net_util.h" | 53 #include "net/base/net_util.h" |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 // Stop the hang monitor now that the unload handler has finished. | 411 // Stop the hang monitor now that the unload handler has finished. |
| 413 StopHangMonitorTimeout(); | 412 StopHangMonitorTimeout(); |
| 414 is_waiting_for_unload_ack_ = false; | 413 is_waiting_for_unload_ack_ = false; |
| 415 delegate_->SwappedOut(this); | 414 delegate_->SwappedOut(this); |
| 416 } | 415 } |
| 417 | 416 |
| 418 void RenderViewHostImpl::WasSwappedOut() { | 417 void RenderViewHostImpl::WasSwappedOut() { |
| 419 // Don't bother reporting hung state anymore. | 418 // Don't bother reporting hung state anymore. |
| 420 StopHangMonitorTimeout(); | 419 StopHangMonitorTimeout(); |
| 421 | 420 |
| 422 // If we are still waiting on the unload handler to be run, we consider | |
| 423 // the process hung and we should terminate it if there are no other tabs | |
| 424 // using the process. If there are other views using this process, the | |
| 425 // unresponsive renderer timeout will catch it. | |
| 426 bool hung = is_waiting_for_unload_ack_; | |
| 427 | |
| 428 // Now that we're no longer the active RVH in the tab, start filtering out | 421 // Now that we're no longer the active RVH in the tab, start filtering out |
| 429 // most IPC messages. Usually the renderer will have stopped sending | 422 // most IPC messages. Usually the renderer will have stopped sending |
| 430 // messages as of OnSwapOutACK. However, we may have timed out waiting | 423 // messages as of OnSwapOutACK. However, we may have timed out waiting |
| 431 // for that message, and additional IPC messages may keep streaming in. | 424 // for that message, and additional IPC messages may keep streaming in. |
| 432 // We filter them out, as long as that won't cause problems (e.g., we | 425 // We filter them out, as long as that won't cause problems (e.g., we |
| 433 // still allow synchronous messages through). | 426 // still allow synchronous messages through). |
| 434 SetSwappedOut(true); | 427 SetSwappedOut(true); |
| 435 | 428 |
| 436 // If we are not running the renderer in process and no other tab is using | |
| 437 // the hung process, kill it, assuming it is a real process (unit tests don't | |
| 438 // have real processes). | |
| 439 if (hung) { | |
| 440 base::ProcessHandle process_handle = GetProcess()->GetHandle(); | |
| 441 int views = 0; | |
| 442 | |
| 443 // Count the number of listeners for the process, which is equivalent to | |
| 444 // views using the process as of this writing. | |
| 445 content::RenderProcessHost::listeners_iterator iter( | |
| 446 GetProcess()->ListenersIterator()); | |
| 447 for (; !iter.IsAtEnd(); iter.Advance()) | |
| 448 ++views; | |
| 449 | |
| 450 if (!content::RenderProcessHost::run_renderer_in_process() && | |
| 451 process_handle && views <= 1) { | |
| 452 // We expect the delegate for this RVH to be TabContents, as it is the | |
| 453 // only class that swaps out render view hosts on navigation. | |
| 454 DCHECK(delegate_->GetRenderViewType() == content::VIEW_TYPE_TAB_CONTENTS); | |
| 455 | |
| 456 // Kill the process only if TabContents sets SuddenTerminationAllowed, | |
| 457 // which indicates that the timer has expired. | |
| 458 // This is not the case if we load data URLs or about:blank. The reason | |
| 459 // is that there is no network requests and this code is hit without | |
| 460 // setting the unresponsiveness timer. This allows a corner case where a | |
| 461 // navigation to a data URL will leave a process running, if the | |
| 462 // beforeunload handler completes fine, but the unload handler hangs. | |
| 463 // At this time, the complexity to solve this edge case is not worthwhile. | |
| 464 if (SuddenTerminationAllowed()) | |
| 465 base::KillProcess(process_handle, content::RESULT_CODE_HUNG, false); | |
| 466 } | |
| 467 } | |
| 468 | |
| 469 // Inform the renderer that it can exit if no one else is using it. | 429 // Inform the renderer that it can exit if no one else is using it. |
| 470 Send(new ViewMsg_WasSwappedOut(GetRoutingID())); | 430 Send(new ViewMsg_WasSwappedOut(GetRoutingID())); |
| 471 } | 431 } |
| 472 | 432 |
| 473 void RenderViewHostImpl::ClosePage() { | 433 void RenderViewHostImpl::ClosePage() { |
| 474 // Start the hang monitor in case the renderer hangs in the unload handler. | 434 // Start the hang monitor in case the renderer hangs in the unload handler. |
| 475 is_waiting_for_unload_ack_ = true; | 435 is_waiting_for_unload_ack_ = true; |
| 476 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); | 436 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
| 477 | 437 |
| 478 if (IsRenderViewLive()) { | 438 if (IsRenderViewLive()) { |
| (...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1761 // can cause navigations to be ignored in OnMsgNavigate. | 1721 // can cause navigations to be ignored in OnMsgNavigate. |
| 1762 is_waiting_for_beforeunload_ack_ = false; | 1722 is_waiting_for_beforeunload_ack_ = false; |
| 1763 is_waiting_for_unload_ack_ = false; | 1723 is_waiting_for_unload_ack_ = false; |
| 1764 } | 1724 } |
| 1765 | 1725 |
| 1766 void RenderViewHostImpl::ClearPowerSaveBlockers() { | 1726 void RenderViewHostImpl::ClearPowerSaveBlockers() { |
| 1767 STLDeleteValues(&power_save_blockers_); | 1727 STLDeleteValues(&power_save_blockers_); |
| 1768 } | 1728 } |
| 1769 | 1729 |
| 1770 } // namespace content | 1730 } // namespace content |
| OLD | NEW |