OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/frame_host/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 2530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2541 // Start the hang monitor in case the renderer hangs in the beforeunload | 2541 // Start the hang monitor in case the renderer hangs in the beforeunload |
2542 // handler. | 2542 // handler. |
2543 is_waiting_for_beforeunload_ack_ = true; | 2543 is_waiting_for_beforeunload_ack_ = true; |
2544 unload_ack_is_for_navigation_ = for_navigation; | 2544 unload_ack_is_for_navigation_ = for_navigation; |
2545 if (render_view_host_->GetDelegate()->IsJavaScriptDialogShowing()) { | 2545 if (render_view_host_->GetDelegate()->IsJavaScriptDialogShowing()) { |
2546 // If there is a JavaScript dialog up, don't bother sending the renderer | 2546 // If there is a JavaScript dialog up, don't bother sending the renderer |
2547 // the unload event because it is known unresponsive, waiting for the | 2547 // the unload event because it is known unresponsive, waiting for the |
2548 // reply from the dialog. | 2548 // reply from the dialog. |
2549 SimulateBeforeUnloadAck(); | 2549 SimulateBeforeUnloadAck(); |
2550 } else { | 2550 } else { |
2551 beforeunload_timeout_type_ = | |
2552 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_BEFORE_UNLOAD; | |
2553 beforeunload_timeout_->Start( | 2551 beforeunload_timeout_->Start( |
2554 TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS)); | 2552 TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS)); |
2555 send_before_unload_start_time_ = base::TimeTicks::Now(); | 2553 send_before_unload_start_time_ = base::TimeTicks::Now(); |
2556 Send(new FrameMsg_BeforeUnload(routing_id_, is_reload)); | 2554 Send(new FrameMsg_BeforeUnload(routing_id_, is_reload)); |
2557 } | 2555 } |
2558 } | 2556 } |
2559 } | 2557 } |
2560 | 2558 |
2561 void RenderFrameHostImpl::SimulateBeforeUnloadAck() { | 2559 void RenderFrameHostImpl::SimulateBeforeUnloadAck() { |
2562 DCHECK(is_waiting_for_beforeunload_ack_); | 2560 DCHECK(is_waiting_for_beforeunload_ack_); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2624 // If executing as part of beforeunload event handling, there may have been | 2622 // If executing as part of beforeunload event handling, there may have been |
2625 // timers stopped in this frame or a frame up in the frame hierarchy. Restart | 2623 // timers stopped in this frame or a frame up in the frame hierarchy. Restart |
2626 // any timers that were stopped in OnRunBeforeUnloadConfirm(). | 2624 // any timers that were stopped in OnRunBeforeUnloadConfirm(). |
2627 for (RenderFrameHostImpl* frame = this; frame; frame = frame->GetParent()) { | 2625 for (RenderFrameHostImpl* frame = this; frame; frame = frame->GetParent()) { |
2628 if (frame->is_waiting_for_beforeunload_ack_) { | 2626 if (frame->is_waiting_for_beforeunload_ack_) { |
2629 // If we are waiting for a beforeunload ack and the user has suppressed | 2627 // If we are waiting for a beforeunload ack and the user has suppressed |
2630 // messages, kill the tab immediately. A page that's spamming is | 2628 // messages, kill the tab immediately. A page that's spamming is |
2631 // presumably malicious, so there's no point in continuing to run its | 2629 // presumably malicious, so there's no point in continuing to run its |
2632 // script and dragging out the process. | 2630 // script and dragging out the process. |
2633 if (dialog_was_suppressed) { | 2631 if (dialog_was_suppressed) { |
2634 UMA_HISTOGRAM_ENUMERATION( | |
2635 "ChildProcess.HangRendererType", | |
2636 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_DIALOG_SUPPRESSED, | |
2637 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_MAX); | |
2638 | |
2639 frame->SimulateBeforeUnloadAck(); | 2632 frame->SimulateBeforeUnloadAck(); |
2640 } else { | 2633 } else { |
2641 frame->beforeunload_timeout_type_ = | |
2642 success | |
2643 ? RendererUnresponsiveType::RENDERER_UNRESPONSIVE_BEFORE_UNLOAD | |
2644 : RendererUnresponsiveType::RENDERER_UNRESPONSIVE_DIALOG_CLOSED; | |
2645 frame->beforeunload_timeout_->Start( | 2634 frame->beforeunload_timeout_->Start( |
2646 TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS)); | 2635 TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS)); |
2647 } | 2636 } |
2648 } | 2637 } |
2649 } | 2638 } |
2650 } | 2639 } |
2651 | 2640 |
2652 void RenderFrameHostImpl::SendJavaScriptDialogReply( | 2641 void RenderFrameHostImpl::SendJavaScriptDialogReply( |
2653 IPC::Message* reply_msg, | 2642 IPC::Message* reply_msg, |
2654 bool success, | 2643 bool success, |
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3469 return NavigationHandleImpl::Create( | 3458 return NavigationHandleImpl::Create( |
3470 params.url, params.redirects, frame_tree_node_, is_renderer_initiated, | 3459 params.url, params.redirects, frame_tree_node_, is_renderer_initiated, |
3471 params.was_within_same_page, base::TimeTicks::Now(), | 3460 params.was_within_same_page, base::TimeTicks::Now(), |
3472 entry_id_for_data_nav, false); // started_from_context_menu | 3461 entry_id_for_data_nav, false); // started_from_context_menu |
3473 } | 3462 } |
3474 | 3463 |
3475 void RenderFrameHostImpl::BeforeUnloadTimeout() { | 3464 void RenderFrameHostImpl::BeforeUnloadTimeout() { |
3476 if (render_view_host_->GetDelegate()->ShouldIgnoreUnresponsiveRenderer()) | 3465 if (render_view_host_->GetDelegate()->ShouldIgnoreUnresponsiveRenderer()) |
3477 return; | 3466 return; |
3478 | 3467 |
3479 UMA_HISTOGRAM_ENUMERATION( | |
3480 "ChildProcess.HangRendererType", beforeunload_timeout_type_, | |
3481 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_MAX); | |
3482 | |
3483 SimulateBeforeUnloadAck(); | 3468 SimulateBeforeUnloadAck(); |
3484 } | 3469 } |
3485 | 3470 |
3486 } // namespace content | 3471 } // namespace content |
OLD | NEW |