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

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

Issue 606113005: Move RenderViewHost swap out state to RenderFrameHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix review suggestions Created 6 years, 2 months 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
OLDNEW
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 16 matching lines...) Expand all
27 #include "content/browser/child_process_security_policy_impl.h" 27 #include "content/browser/child_process_security_policy_impl.h"
28 #include "content/browser/dom_storage/session_storage_namespace_impl.h" 28 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
29 #include "content/browser/frame_host/frame_tree.h" 29 #include "content/browser/frame_host/frame_tree.h"
30 #include "content/browser/gpu/compositor_util.h" 30 #include "content/browser/gpu/compositor_util.h"
31 #include "content/browser/gpu/gpu_data_manager_impl.h" 31 #include "content/browser/gpu/gpu_data_manager_impl.h"
32 #include "content/browser/gpu/gpu_process_host.h" 32 #include "content/browser/gpu/gpu_process_host.h"
33 #include "content/browser/gpu/gpu_surface_tracker.h" 33 #include "content/browser/gpu/gpu_surface_tracker.h"
34 #include "content/browser/host_zoom_map_impl.h" 34 #include "content/browser/host_zoom_map_impl.h"
35 #include "content/browser/loader/resource_dispatcher_host_impl.h" 35 #include "content/browser/loader/resource_dispatcher_host_impl.h"
36 #include "content/browser/renderer_host/dip_util.h" 36 #include "content/browser/renderer_host/dip_util.h"
37 #include "content/browser/renderer_host/input/timeout_monitor.h"
38 #include "content/browser/renderer_host/media/audio_renderer_host.h" 37 #include "content/browser/renderer_host/media/audio_renderer_host.h"
39 #include "content/browser/renderer_host/render_process_host_impl.h" 38 #include "content/browser/renderer_host/render_process_host_impl.h"
40 #include "content/browser/renderer_host/render_view_host_delegate.h" 39 #include "content/browser/renderer_host/render_view_host_delegate.h"
41 #include "content/browser/renderer_host/render_view_host_delegate_view.h" 40 #include "content/browser/renderer_host/render_view_host_delegate_view.h"
42 #include "content/browser/renderer_host/render_widget_host_view_base.h" 41 #include "content/browser/renderer_host/render_widget_host_view_base.h"
43 #include "content/common/browser_plugin/browser_plugin_messages.h" 42 #include "content/common/browser_plugin/browser_plugin_messages.h"
44 #include "content/common/content_switches_internal.h" 43 #include "content/common/content_switches_internal.h"
45 #include "content/common/drag_messages.h" 44 #include "content/common/drag_messages.h"
46 #include "content/common/frame_messages.h" 45 #include "content/common/frame_messages.h"
47 #include "content/common/input_messages.h" 46 #include "content/common/input_messages.h"
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 128
130 } // namespace 129 } // namespace
131 130
132 // static 131 // static
133 const int RenderViewHostImpl::kUnloadTimeoutMS = 1000; 132 const int RenderViewHostImpl::kUnloadTimeoutMS = 1000;
134 133
135 /////////////////////////////////////////////////////////////////////////////// 134 ///////////////////////////////////////////////////////////////////////////////
136 // RenderViewHost, public: 135 // RenderViewHost, public:
137 136
138 // static 137 // static
139 bool RenderViewHostImpl::IsRVHStateActive(RenderViewHostImplState rvh_state) {
140 if (rvh_state == STATE_DEFAULT ||
141 rvh_state == STATE_WAITING_FOR_CLOSE)
142 return true;
143 return false;
144 }
145
146 // static
147 RenderViewHost* RenderViewHost::FromID(int render_process_id, 138 RenderViewHost* RenderViewHost::FromID(int render_process_id,
148 int render_view_id) { 139 int render_view_id) {
149 return RenderViewHostImpl::FromID(render_process_id, render_view_id); 140 return RenderViewHostImpl::FromID(render_process_id, render_view_id);
150 } 141 }
151 142
152 // static 143 // static
153 RenderViewHost* RenderViewHost::From(RenderWidgetHost* rwh) { 144 RenderViewHost* RenderViewHost::From(RenderWidgetHost* rwh) {
154 DCHECK(rwh->IsRenderView()); 145 DCHECK(rwh->IsRenderView());
155 return static_cast<RenderViewHostImpl*>(RenderWidgetHostImpl::From(rwh)); 146 return static_cast<RenderViewHostImpl*>(RenderWidgetHostImpl::From(rwh));
156 } 147 }
(...skipping 22 matching lines...) Expand all
179 : RenderWidgetHostImpl(widget_delegate, 170 : RenderWidgetHostImpl(widget_delegate,
180 instance->GetProcess(), 171 instance->GetProcess(),
181 routing_id, 172 routing_id,
182 hidden), 173 hidden),
183 frames_ref_count_(0), 174 frames_ref_count_(0),
184 delegate_(delegate), 175 delegate_(delegate),
185 instance_(static_cast<SiteInstanceImpl*>(instance)), 176 instance_(static_cast<SiteInstanceImpl*>(instance)),
186 waiting_for_drag_context_response_(false), 177 waiting_for_drag_context_response_(false),
187 enabled_bindings_(0), 178 enabled_bindings_(0),
188 page_id_(-1), 179 page_id_(-1),
180 is_active_(!swapped_out),
181 is_swapped_out_(swapped_out),
189 main_frame_routing_id_(main_frame_routing_id), 182 main_frame_routing_id_(main_frame_routing_id),
190 run_modal_reply_msg_(NULL), 183 run_modal_reply_msg_(NULL),
191 run_modal_opener_id_(MSG_ROUTING_NONE), 184 run_modal_opener_id_(MSG_ROUTING_NONE),
192 is_waiting_for_beforeunload_ack_(false), 185 is_waiting_for_close_ack_(false),
193 unload_ack_is_for_cross_site_transition_(false),
194 sudden_termination_allowed_(false), 186 sudden_termination_allowed_(false),
195 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING), 187 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING),
196 virtual_keyboard_requested_(false), 188 virtual_keyboard_requested_(false),
197 is_focused_element_editable_(false), 189 is_focused_element_editable_(false),
198 updating_web_preferences_(false), 190 updating_web_preferences_(false),
199 weak_factory_(this) { 191 weak_factory_(this) {
200 DCHECK(instance_.get()); 192 DCHECK(instance_.get());
201 CHECK(delegate_); // http://crbug.com/82827 193 CHECK(delegate_); // http://crbug.com/82827
202 194
203 GetProcess()->EnableSendQueue(); 195 GetProcess()->EnableSendQueue();
204 196
205 if (swapped_out) {
206 rvh_state_ = STATE_SWAPPED_OUT;
207 } else {
208 rvh_state_ = STATE_DEFAULT;
209 instance_->increment_active_view_count();
210 }
211
212 if (ResourceDispatcherHostImpl::Get()) { 197 if (ResourceDispatcherHostImpl::Get()) {
213 BrowserThread::PostTask( 198 BrowserThread::PostTask(
214 BrowserThread::IO, FROM_HERE, 199 BrowserThread::IO, FROM_HERE,
215 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated, 200 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated,
216 base::Unretained(ResourceDispatcherHostImpl::Get()), 201 base::Unretained(ResourceDispatcherHostImpl::Get()),
217 GetProcess()->GetID(), GetRoutingID(), !is_hidden())); 202 GetProcess()->GetID(), GetRoutingID(), !is_hidden()));
218 } 203 }
219 204
220 #if defined(ENABLE_BROWSER_CDMS) 205 #if defined(ENABLE_BROWSER_CDMS)
221 media_web_contents_observer_.reset(new MediaWebContentsObserver(this)); 206 media_web_contents_observer_.reset(new MediaWebContentsObserver(this));
222 #endif 207 #endif
223
224 unload_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind(
225 &RenderViewHostImpl::OnSwappedOut, weak_factory_.GetWeakPtr(), true)));
226 } 208 }
227 209
228 RenderViewHostImpl::~RenderViewHostImpl() { 210 RenderViewHostImpl::~RenderViewHostImpl() {
229 if (ResourceDispatcherHostImpl::Get()) { 211 if (ResourceDispatcherHostImpl::Get()) {
230 BrowserThread::PostTask( 212 BrowserThread::PostTask(
231 BrowserThread::IO, FROM_HERE, 213 BrowserThread::IO, FROM_HERE,
232 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted, 214 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted,
233 base::Unretained(ResourceDispatcherHostImpl::Get()), 215 base::Unretained(ResourceDispatcherHostImpl::Get()),
234 GetProcess()->GetID(), GetRoutingID())); 216 GetProcess()->GetID(), GetRoutingID()));
235 } 217 }
236 218
237 delegate_->RenderViewDeleted(this); 219 delegate_->RenderViewDeleted(this);
238
239 // If this was swapped out, it already decremented the active view
240 // count of the SiteInstance it belongs to.
241 if (IsRVHStateActive(rvh_state_))
242 instance_->decrement_active_view_count();
243 } 220 }
244 221
245 RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const { 222 RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const {
246 return delegate_; 223 return delegate_;
247 } 224 }
248 225
249 SiteInstance* RenderViewHostImpl::GetSiteInstance() const { 226 SiteInstanceImpl* RenderViewHostImpl::GetSiteInstance() const {
250 return instance_.get(); 227 return instance_.get();
251 } 228 }
252 229
253 bool RenderViewHostImpl::CreateRenderView( 230 bool RenderViewHostImpl::CreateRenderView(
254 const base::string16& frame_name, 231 const base::string16& frame_name,
255 int opener_route_id, 232 int opener_route_id,
256 int proxy_route_id, 233 int proxy_route_id,
257 int32 max_page_id, 234 int32 max_page_id,
258 bool window_was_created_with_opener) { 235 bool window_was_created_with_opener) {
259 TRACE_EVENT0("renderer_host,navigation", 236 TRACE_EVENT0("renderer_host,navigation",
(...skipping 25 matching lines...) Expand all
285 delegate_->GetRendererPrefs(GetProcess()->GetBrowserContext()); 262 delegate_->GetRendererPrefs(GetProcess()->GetBrowserContext());
286 params.web_preferences = GetWebkitPreferences(); 263 params.web_preferences = GetWebkitPreferences();
287 params.view_id = GetRoutingID(); 264 params.view_id = GetRoutingID();
288 params.main_frame_routing_id = main_frame_routing_id_; 265 params.main_frame_routing_id = main_frame_routing_id_;
289 params.surface_id = surface_id(); 266 params.surface_id = surface_id();
290 params.session_storage_namespace_id = 267 params.session_storage_namespace_id =
291 delegate_->GetSessionStorageNamespace(instance_.get())->id(); 268 delegate_->GetSessionStorageNamespace(instance_.get())->id();
292 params.frame_name = frame_name; 269 params.frame_name = frame_name;
293 // Ensure the RenderView sets its opener correctly. 270 // Ensure the RenderView sets its opener correctly.
294 params.opener_route_id = opener_route_id; 271 params.opener_route_id = opener_route_id;
295 params.swapped_out = !IsRVHStateActive(rvh_state_); 272 params.swapped_out = !is_active_;
296 params.proxy_routing_id = proxy_route_id; 273 params.proxy_routing_id = proxy_route_id;
297 params.hidden = is_hidden(); 274 params.hidden = is_hidden();
298 params.never_visible = delegate_->IsNeverVisible(); 275 params.never_visible = delegate_->IsNeverVisible();
299 params.window_was_created_with_opener = window_was_created_with_opener; 276 params.window_was_created_with_opener = window_was_created_with_opener;
300 params.next_page_id = next_page_id; 277 params.next_page_id = next_page_id;
301 GetWebScreenInfo(&params.screen_info); 278 GetWebScreenInfo(&params.screen_info);
302 279
303 Send(new ViewMsg_New(params)); 280 Send(new ViewMsg_New(params));
304 281
305 // If it's enabled, tell the renderer to set up the Javascript bindings for 282 // If it's enabled, tell the renderer to set up the Javascript bindings for
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 base::FieldTrialList::FindFullName("V8ScriptStreaming") == "Enabled"; 460 base::FieldTrialList::FindFullName("V8ScriptStreaming") == "Enabled";
484 461
485 GetContentClient()->browser()->OverrideWebkitPrefs(this, url, &prefs); 462 GetContentClient()->browser()->OverrideWebkitPrefs(this, url, &prefs);
486 return prefs; 463 return prefs;
487 } 464 }
488 465
489 void RenderViewHostImpl::SuppressDialogsUntilSwapOut() { 466 void RenderViewHostImpl::SuppressDialogsUntilSwapOut() {
490 Send(new ViewMsg_SuppressDialogsUntilSwapOut(GetRoutingID())); 467 Send(new ViewMsg_SuppressDialogsUntilSwapOut(GetRoutingID()));
491 } 468 }
492 469
493 void RenderViewHostImpl::OnSwappedOut(bool timed_out) {
494 // Ignore spurious swap out ack.
495 if (!IsWaitingForUnloadACK())
496 return;
497
498 TRACE_EVENT0("navigation", "RenderViewHostImpl::OnSwappedOut");
499 unload_event_monitor_timeout_->Stop();
500 if (timed_out) {
501 base::ProcessHandle process_handle = GetProcess()->GetHandle();
502 int views = 0;
503
504 // Count the number of active widget hosts for the process, which
505 // is equivalent to views using the process as of this writing.
506 scoped_ptr<RenderWidgetHostIterator> widgets(
507 RenderWidgetHost::GetRenderWidgetHosts());
508 while (RenderWidgetHost* widget = widgets->GetNextHost()) {
509 if (widget->GetProcess()->GetID() == GetProcess()->GetID())
510 ++views;
511 }
512
513 if (!RenderProcessHost::run_renderer_in_process() &&
514 process_handle && views <= 1) {
515 // The process can safely be terminated, only if WebContents sets
516 // SuddenTerminationAllowed, which indicates that the timer has expired.
517 // This is not the case if we load data URLs or about:blank. The reason
518 // is that those have no network requests and this code is hit without
519 // setting the unresponsiveness timer. This allows a corner case where a
520 // navigation to a data URL will leave a process running, if the
521 // beforeunload handler completes fine, but the unload handler hangs.
522 // At this time, the complexity to solve this edge case is not worthwhile.
523 if (SuddenTerminationAllowed()) {
524 // We should kill the process, but for now, just log the data so we can
525 // diagnose the kill rate and investigate if separate timer is needed.
526 // http://crbug.com/104346.
527
528 // Log a histogram point to help us diagnose how many of those kills
529 // we have performed. 1 is the enum value for RendererType Normal for
530 // the histogram.
531 UMA_HISTOGRAM_PERCENTAGE(
532 "BrowserRenderProcessHost.ChildKillsUnresponsive", 1);
533 }
534 }
535 // This is going to be incorrect for subframes and will only hit if
536 // --site-per-process is specified.
537 TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this);
538 }
539
540 switch (rvh_state_) {
541 case STATE_PENDING_SWAP_OUT:
542 SetState(STATE_SWAPPED_OUT);
543 break;
544 case STATE_PENDING_SHUTDOWN:
545 DCHECK(!pending_shutdown_on_swap_out_.is_null());
546 pending_shutdown_on_swap_out_.Run();
547 break;
548 default:
549 NOTREACHED();
550 }
551 }
552
553 void RenderViewHostImpl::SetPendingShutdown(const base::Closure& on_swap_out) {
554 pending_shutdown_on_swap_out_ = on_swap_out;
555 SetState(STATE_PENDING_SHUTDOWN);
556 }
557
558 void RenderViewHostImpl::ClosePage() { 470 void RenderViewHostImpl::ClosePage() {
559 SetState(STATE_WAITING_FOR_CLOSE); 471 is_waiting_for_close_ack_ = true;
560 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); 472 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
561 473
562 if (IsRenderViewLive()) { 474 if (IsRenderViewLive()) {
563 // Since we are sending an IPC message to the renderer, increase the event 475 // Since we are sending an IPC message to the renderer, increase the event
564 // count to prevent the hang monitor timeout from being stopped by input 476 // count to prevent the hang monitor timeout from being stopped by input
565 // event acknowledgements. 477 // event acknowledgements.
566 increment_in_flight_event_count(); 478 increment_in_flight_event_count();
567 479
568 // TODO(creis): Should this be moved to Shutdown? It may not be called for 480 // TODO(creis): Should this be moved to Shutdown? It may not be called for
569 // RenderViewHosts that have been swapped out. 481 // RenderViewHosts that have been swapped out.
570 NotificationService::current()->Notify( 482 NotificationService::current()->Notify(
571 NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, 483 NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW,
572 Source<RenderViewHost>(this), 484 Source<RenderViewHost>(this),
573 NotificationService::NoDetails()); 485 NotificationService::NoDetails());
574 486
575 Send(new ViewMsg_ClosePage(GetRoutingID())); 487 Send(new ViewMsg_ClosePage(GetRoutingID()));
576 } else { 488 } else {
577 // This RenderViewHost doesn't have a live renderer, so just skip the unload 489 // This RenderViewHost doesn't have a live renderer, so just skip the unload
578 // event and close the page. 490 // event and close the page.
579 ClosePageIgnoringUnloadEvents(); 491 ClosePageIgnoringUnloadEvents();
580 } 492 }
581 } 493 }
582 494
583 void RenderViewHostImpl::ClosePageIgnoringUnloadEvents() { 495 void RenderViewHostImpl::ClosePageIgnoringUnloadEvents() {
584 StopHangMonitorTimeout(); 496 StopHangMonitorTimeout();
585 is_waiting_for_beforeunload_ack_ = false; 497 is_waiting_for_close_ack_ = false;
586 498
587 sudden_termination_allowed_ = true; 499 sudden_termination_allowed_ = true;
588 delegate_->Close(this); 500 delegate_->Close(this);
589 } 501 }
590 502
591 #if defined(OS_ANDROID) 503 #if defined(OS_ANDROID)
592 void RenderViewHostImpl::ActivateNearestFindResult(int request_id, 504 void RenderViewHostImpl::ActivateNearestFindResult(int request_id,
593 float x, 505 float x,
594 float y) { 506 float y) {
595 Send(new InputMsg_ActivateNearestFindResult(GetRoutingID(), 507 Send(new InputMsg_ActivateNearestFindResult(GetRoutingID(),
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 778
867 /////////////////////////////////////////////////////////////////////////////// 779 ///////////////////////////////////////////////////////////////////////////////
868 // RenderViewHostImpl, IPC message handlers: 780 // RenderViewHostImpl, IPC message handlers:
869 781
870 bool RenderViewHostImpl::OnMessageReceived(const IPC::Message& msg) { 782 bool RenderViewHostImpl::OnMessageReceived(const IPC::Message& msg) {
871 if (!BrowserMessageFilter::CheckCanDispatchOnUI(msg, this)) 783 if (!BrowserMessageFilter::CheckCanDispatchOnUI(msg, this))
872 return true; 784 return true;
873 785
874 // Filter out most IPC messages if this renderer is swapped out. 786 // Filter out most IPC messages if this renderer is swapped out.
875 // We still want to handle certain ACKs to keep our state consistent. 787 // We still want to handle certain ACKs to keep our state consistent.
876 if (IsSwappedOut()) { 788 if (is_swapped_out_) {
877 if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) { 789 if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) {
878 // If this is a synchronous message and we decided not to handle it, 790 // If this is a synchronous message and we decided not to handle it,
879 // we must send an error reply, or else the renderer will be stuck 791 // we must send an error reply, or else the renderer will be stuck
880 // and won't respond to future requests. 792 // and won't respond to future requests.
881 if (msg.is_sync()) { 793 if (msg.is_sync()) {
882 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); 794 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
883 reply->set_reply_error(); 795 reply->set_reply_error();
884 Send(reply); 796 Send(reply);
885 } 797 }
886 // Don't continue looking for someone to handle it. 798 // Don't continue looking for someone to handle it.
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 } 922 }
1011 923
1012 void RenderViewHostImpl::CreateNewFullscreenWidget(int route_id) { 924 void RenderViewHostImpl::CreateNewFullscreenWidget(int route_id) {
1013 delegate_->CreateNewFullscreenWidget(GetProcess()->GetID(), route_id); 925 delegate_->CreateNewFullscreenWidget(GetProcess()->GetID(), route_id);
1014 } 926 }
1015 927
1016 void RenderViewHostImpl::OnShowView(int route_id, 928 void RenderViewHostImpl::OnShowView(int route_id,
1017 WindowOpenDisposition disposition, 929 WindowOpenDisposition disposition,
1018 const gfx::Rect& initial_pos, 930 const gfx::Rect& initial_pos,
1019 bool user_gesture) { 931 bool user_gesture) {
1020 if (IsRVHStateActive(rvh_state_)) { 932 if (is_active_) {
1021 delegate_->ShowCreatedWindow( 933 delegate_->ShowCreatedWindow(
1022 route_id, disposition, initial_pos, user_gesture); 934 route_id, disposition, initial_pos, user_gesture);
1023 } 935 }
1024 Send(new ViewMsg_Move_ACK(route_id)); 936 Send(new ViewMsg_Move_ACK(route_id));
1025 } 937 }
1026 938
1027 void RenderViewHostImpl::OnShowWidget(int route_id, 939 void RenderViewHostImpl::OnShowWidget(int route_id,
1028 const gfx::Rect& initial_pos) { 940 const gfx::Rect& initial_pos) {
1029 if (IsRVHStateActive(rvh_state_)) 941 if (is_active_)
1030 delegate_->ShowCreatedWidget(route_id, initial_pos); 942 delegate_->ShowCreatedWidget(route_id, initial_pos);
1031 Send(new ViewMsg_Move_ACK(route_id)); 943 Send(new ViewMsg_Move_ACK(route_id));
1032 } 944 }
1033 945
1034 void RenderViewHostImpl::OnShowFullscreenWidget(int route_id) { 946 void RenderViewHostImpl::OnShowFullscreenWidget(int route_id) {
1035 if (IsRVHStateActive(rvh_state_)) 947 if (is_active_)
1036 delegate_->ShowCreatedFullscreenWidget(route_id); 948 delegate_->ShowCreatedFullscreenWidget(route_id);
1037 Send(new ViewMsg_Move_ACK(route_id)); 949 Send(new ViewMsg_Move_ACK(route_id));
1038 } 950 }
1039 951
1040 void RenderViewHostImpl::OnRunModal(int opener_id, IPC::Message* reply_msg) { 952 void RenderViewHostImpl::OnRunModal(int opener_id, IPC::Message* reply_msg) {
1041 DCHECK(!run_modal_reply_msg_); 953 DCHECK(!run_modal_reply_msg_);
1042 run_modal_reply_msg_ = reply_msg; 954 run_modal_reply_msg_ = reply_msg;
1043 run_modal_opener_id_ = opener_id; 955 run_modal_opener_id_ = opener_id;
1044 956
1045 RecordAction(base::UserMetricsAction("ShowModalDialog")); 957 RecordAction(base::UserMetricsAction("ShowModalDialog"));
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 // filenames it can't access in a future session restore. 1000 // filenames it can't access in a future session restore.
1089 if (!CanAccessFilesOfPageState(state)) { 1001 if (!CanAccessFilesOfPageState(state)) {
1090 GetProcess()->ReceivedBadMessage(); 1002 GetProcess()->ReceivedBadMessage();
1091 return; 1003 return;
1092 } 1004 }
1093 1005
1094 delegate_->UpdateState(this, page_id, state); 1006 delegate_->UpdateState(this, page_id, state);
1095 } 1007 }
1096 1008
1097 void RenderViewHostImpl::OnUpdateTargetURL(const GURL& url) { 1009 void RenderViewHostImpl::OnUpdateTargetURL(const GURL& url) {
1098 if (IsRVHStateActive(rvh_state_)) 1010 if (is_active_)
1099 delegate_->UpdateTargetURL(url); 1011 delegate_->UpdateTargetURL(url);
1100 1012
1101 // Send a notification back to the renderer that we are ready to 1013 // Send a notification back to the renderer that we are ready to
1102 // receive more target urls. 1014 // receive more target urls.
1103 Send(new ViewMsg_UpdateTargetURL_ACK(GetRoutingID())); 1015 Send(new ViewMsg_UpdateTargetURL_ACK(GetRoutingID()));
1104 } 1016 }
1105 1017
1106 void RenderViewHostImpl::OnClose() { 1018 void RenderViewHostImpl::OnClose() {
1107 // If the renderer is telling us to close, it has already run the unload 1019 // If the renderer is telling us to close, it has already run the unload
1108 // events, and we can take the fast path. 1020 // events, and we can take the fast path.
1109 ClosePageIgnoringUnloadEvents(); 1021 ClosePageIgnoringUnloadEvents();
1110 } 1022 }
1111 1023
1112 void RenderViewHostImpl::OnRequestMove(const gfx::Rect& pos) { 1024 void RenderViewHostImpl::OnRequestMove(const gfx::Rect& pos) {
1113 if (IsRVHStateActive(rvh_state_)) 1025 if (is_active_)
1114 delegate_->RequestMove(pos); 1026 delegate_->RequestMove(pos);
1115 Send(new ViewMsg_Move_ACK(GetRoutingID())); 1027 Send(new ViewMsg_Move_ACK(GetRoutingID()));
1116 } 1028 }
1117 1029
1118 void RenderViewHostImpl::OnDocumentAvailableInMainFrame( 1030 void RenderViewHostImpl::OnDocumentAvailableInMainFrame(
1119 bool uses_temporary_zoom_level) { 1031 bool uses_temporary_zoom_level) {
1120 delegate_->DocumentAvailableInMainFrame(this); 1032 delegate_->DocumentAvailableInMainFrame(this);
1121 1033
1122 if (!uses_temporary_zoom_level) 1034 if (!uses_temporary_zoom_level)
1123 return; 1035 return;
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1253 void RenderViewHostImpl::OnUserGesture() { 1165 void RenderViewHostImpl::OnUserGesture() {
1254 delegate_->OnUserGesture(); 1166 delegate_->OnUserGesture();
1255 } 1167 }
1256 1168
1257 void RenderViewHostImpl::OnClosePageACK() { 1169 void RenderViewHostImpl::OnClosePageACK() {
1258 decrement_in_flight_event_count(); 1170 decrement_in_flight_event_count();
1259 ClosePageIgnoringUnloadEvents(); 1171 ClosePageIgnoringUnloadEvents();
1260 } 1172 }
1261 1173
1262 void RenderViewHostImpl::NotifyRendererUnresponsive() { 1174 void RenderViewHostImpl::NotifyRendererUnresponsive() {
1263 delegate_->RendererUnresponsive( 1175 delegate_->RendererUnresponsive(this);
1264 this, is_waiting_for_beforeunload_ack_, IsWaitingForUnloadACK());
1265 } 1176 }
1266 1177
1267 void RenderViewHostImpl::NotifyRendererResponsive() { 1178 void RenderViewHostImpl::NotifyRendererResponsive() {
1268 delegate_->RendererResponsive(this); 1179 delegate_->RendererResponsive(this);
1269 } 1180 }
1270 1181
1271 void RenderViewHostImpl::RequestToLockMouse(bool user_gesture, 1182 void RenderViewHostImpl::RequestToLockMouse(bool user_gesture,
1272 bool last_unlocked_by_target) { 1183 bool last_unlocked_by_target) {
1273 delegate_->RequestToLockMouse(user_gesture, last_unlocked_by_target); 1184 delegate_->RequestToLockMouse(user_gesture, last_unlocked_by_target);
1274 } 1185 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 void RenderViewHostImpl::ForwardKeyboardEvent( 1239 void RenderViewHostImpl::ForwardKeyboardEvent(
1329 const NativeWebKeyboardEvent& key_event) { 1240 const NativeWebKeyboardEvent& key_event) {
1330 if (ignore_input_events()) { 1241 if (ignore_input_events()) {
1331 if (key_event.type == WebInputEvent::RawKeyDown) 1242 if (key_event.type == WebInputEvent::RawKeyDown)
1332 delegate_->OnIgnoredUIEvent(); 1243 delegate_->OnIgnoredUIEvent();
1333 return; 1244 return;
1334 } 1245 }
1335 RenderWidgetHostImpl::ForwardKeyboardEvent(key_event); 1246 RenderWidgetHostImpl::ForwardKeyboardEvent(key_event);
1336 } 1247 }
1337 1248
1338 bool RenderViewHostImpl::IsWaitingForUnloadACK() const {
1339 return rvh_state_ == STATE_WAITING_FOR_CLOSE ||
1340 rvh_state_ == STATE_PENDING_SHUTDOWN ||
1341 rvh_state_ == STATE_PENDING_SWAP_OUT;
1342 }
1343
1344 void RenderViewHostImpl::OnTextSurroundingSelectionResponse( 1249 void RenderViewHostImpl::OnTextSurroundingSelectionResponse(
1345 const base::string16& content, 1250 const base::string16& content,
1346 size_t start_offset, 1251 size_t start_offset,
1347 size_t end_offset) { 1252 size_t end_offset) {
1348 if (!view_) 1253 if (!view_)
1349 return; 1254 return;
1350 view_->OnTextSurroundingSelectionResponse(content, start_offset, end_offset); 1255 view_->OnTextSurroundingSelectionResponse(content, start_offset, end_offset);
1351 } 1256 }
1352 1257
1353 void RenderViewHostImpl::ExitFullscreen() { 1258 void RenderViewHostImpl::ExitFullscreen() {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 #if defined(OS_WIN) 1367 #if defined(OS_WIN)
1463 if (editable) { 1368 if (editable) {
1464 virtual_keyboard_requested_ = base::win::DisplayVirtualKeyboard(); 1369 virtual_keyboard_requested_ = base::win::DisplayVirtualKeyboard();
1465 } else { 1370 } else {
1466 virtual_keyboard_requested_ = false; 1371 virtual_keyboard_requested_ = false;
1467 base::win::DismissVirtualKeyboard(); 1372 base::win::DismissVirtualKeyboard();
1468 } 1373 }
1469 #endif 1374 #endif
1470 } 1375 }
1471 1376
1472 void RenderViewHostImpl::SetState(RenderViewHostImplState rvh_state) {
1473 // We update the number of RenderViews in a SiteInstance when the
1474 // swapped out status of this RenderView gets flipped to/from live.
1475 if (!IsRVHStateActive(rvh_state_) && IsRVHStateActive(rvh_state))
1476 instance_->increment_active_view_count();
1477 else if (IsRVHStateActive(rvh_state_) && !IsRVHStateActive(rvh_state))
1478 instance_->decrement_active_view_count();
1479
1480 // Whenever we change the RVH state to and from live or swapped out state, we
1481 // should not be waiting for beforeunload or unload acks. We clear them here
1482 // to be safe, since they can cause navigations to be ignored in OnNavigate.
1483 if (rvh_state == STATE_DEFAULT ||
1484 rvh_state == STATE_SWAPPED_OUT ||
1485 rvh_state_ == STATE_DEFAULT ||
1486 rvh_state_ == STATE_SWAPPED_OUT) {
1487 is_waiting_for_beforeunload_ack_ = false;
1488 }
1489 rvh_state_ = rvh_state;
1490
1491 }
1492
1493 bool RenderViewHostImpl::CanAccessFilesOfPageState( 1377 bool RenderViewHostImpl::CanAccessFilesOfPageState(
1494 const PageState& state) const { 1378 const PageState& state) const {
1495 ChildProcessSecurityPolicyImpl* policy = 1379 ChildProcessSecurityPolicyImpl* policy =
1496 ChildProcessSecurityPolicyImpl::GetInstance(); 1380 ChildProcessSecurityPolicyImpl::GetInstance();
1497 1381
1498 const std::vector<base::FilePath>& file_paths = state.GetReferencedFiles(); 1382 const std::vector<base::FilePath>& file_paths = state.GetReferencedFiles();
1499 for (std::vector<base::FilePath>::const_iterator file = file_paths.begin(); 1383 for (std::vector<base::FilePath>::const_iterator file = file_paths.begin();
1500 file != file_paths.end(); ++file) { 1384 file != file_paths.end(); ++file) {
1501 if (!policy->CanReadFile(GetProcess()->GetID(), *file)) 1385 if (!policy->CanReadFile(GetProcess()->GetID(), *file))
1502 return false; 1386 return false;
1503 } 1387 }
1504 return true; 1388 return true;
1505 } 1389 }
1506 1390
1507 void RenderViewHostImpl::AttachToFrameTree() { 1391 void RenderViewHostImpl::AttachToFrameTree() {
1508 FrameTree* frame_tree = delegate_->GetFrameTree(); 1392 FrameTree* frame_tree = delegate_->GetFrameTree();
1509 1393
1510 frame_tree->ResetForMainFrameSwap(); 1394 frame_tree->ResetForMainFrameSwap();
1511 } 1395 }
1512 1396
1513 void RenderViewHostImpl::SelectWordAroundCaret() { 1397 void RenderViewHostImpl::SelectWordAroundCaret() {
1514 Send(new ViewMsg_SelectWordAroundCaret(GetRoutingID())); 1398 Send(new ViewMsg_SelectWordAroundCaret(GetRoutingID()));
1515 } 1399 }
1516 1400
1517 } // namespace content 1401 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_view_host_impl.h ('k') | content/browser/renderer_host/render_view_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698