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

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

Issue 6319001: Support window.opener after a process swap. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unload; chrome dependency in RenderWidget. Created 9 years, 7 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 | 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 #include "content/browser/renderer_host/render_view_host.h" 5 #include "content/browser/renderer_host/render_view_host.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 85
86 RenderViewHost::RenderViewHost(SiteInstance* instance, 86 RenderViewHost::RenderViewHost(SiteInstance* instance,
87 RenderViewHostDelegate* delegate, 87 RenderViewHostDelegate* delegate,
88 int routing_id, 88 int routing_id,
89 SessionStorageNamespace* session_storage) 89 SessionStorageNamespace* session_storage)
90 : RenderWidgetHost(instance->GetProcess(), routing_id), 90 : RenderWidgetHost(instance->GetProcess(), routing_id),
91 instance_(instance), 91 instance_(instance),
92 delegate_(delegate), 92 delegate_(delegate),
93 waiting_for_drag_context_response_(false), 93 waiting_for_drag_context_response_(false),
94 enabled_bindings_(0), 94 enabled_bindings_(0),
95 pending_request_id_(0), 95 pending_request_id_(-1),
96 navigations_suspended_(false), 96 navigations_suspended_(false),
97 suspended_nav_message_(NULL), 97 suspended_nav_message_(NULL),
98 is_swapped_out_(false),
98 run_modal_reply_msg_(NULL), 99 run_modal_reply_msg_(NULL),
99 is_waiting_for_beforeunload_ack_(false), 100 is_waiting_for_beforeunload_ack_(false),
100 is_waiting_for_unload_ack_(false), 101 is_waiting_for_unload_ack_(false),
101 unload_ack_is_for_cross_site_transition_(false), 102 unload_ack_is_for_cross_site_transition_(false),
102 are_javascript_messages_suppressed_(false), 103 are_javascript_messages_suppressed_(false),
103 sudden_termination_allowed_(false), 104 sudden_termination_allowed_(false),
104 session_storage_namespace_(session_storage), 105 session_storage_namespace_(session_storage),
105 is_extension_process_(false), 106 is_extension_process_(false),
106 save_accessibility_tree_for_testing_(false), 107 save_accessibility_tree_for_testing_(false),
107 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING) { 108 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING) {
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 Navigate(params); 252 Navigate(params);
252 } 253 }
253 254
254 void RenderViewHost::SetNavigationsSuspended(bool suspend) { 255 void RenderViewHost::SetNavigationsSuspended(bool suspend) {
255 // This should only be called to toggle the state. 256 // This should only be called to toggle the state.
256 DCHECK(navigations_suspended_ != suspend); 257 DCHECK(navigations_suspended_ != suspend);
257 258
258 navigations_suspended_ = suspend; 259 navigations_suspended_ = suspend;
259 if (!suspend && suspended_nav_message_.get()) { 260 if (!suspend && suspended_nav_message_.get()) {
260 // There's a navigation message waiting to be sent. Now that we're not 261 // There's a navigation message waiting to be sent. Now that we're not
261 // suspended anymore, resume navigation by sending it. 262 // suspended anymore, resume navigation by sending it. If we were swapped
263 // out, we should also stop filtering out the IPC messages now.
264 is_swapped_out_ = false;
262 Send(suspended_nav_message_.release()); 265 Send(suspended_nav_message_.release());
263 } 266 }
264 } 267 }
265 268
269 void RenderViewHost::CancelSuspendedNavigations() {
270 // Clear any state if a pending navigation is canceled or pre-empted.
271 if (suspended_nav_message_.get())
272 suspended_nav_message_.reset();
273 navigations_suspended_ = false;
274 }
275
266 void RenderViewHost::FirePageBeforeUnload(bool for_cross_site_transition) { 276 void RenderViewHost::FirePageBeforeUnload(bool for_cross_site_transition) {
267 if (!IsRenderViewLive()) { 277 if (!IsRenderViewLive()) {
268 // This RenderViewHost doesn't have a live renderer, so just skip running 278 // This RenderViewHost doesn't have a live renderer, so just skip running
269 // the onbeforeunload handler. 279 // the onbeforeunload handler.
270 is_waiting_for_beforeunload_ack_ = true; // Checked by OnMsgShouldCloseACK. 280 is_waiting_for_beforeunload_ack_ = true; // Checked by OnMsgShouldCloseACK.
271 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; 281 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition;
272 OnMsgShouldCloseACK(true); 282 OnMsgShouldCloseACK(true);
273 return; 283 return;
274 } 284 }
275 285
(...skipping 12 matching lines...) Expand all
288 } else { 298 } else {
289 // Start the hang monitor in case the renderer hangs in the beforeunload 299 // Start the hang monitor in case the renderer hangs in the beforeunload
290 // handler. 300 // handler.
291 is_waiting_for_beforeunload_ack_ = true; 301 is_waiting_for_beforeunload_ack_ = true;
292 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; 302 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition;
293 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); 303 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
294 Send(new ViewMsg_ShouldClose(routing_id())); 304 Send(new ViewMsg_ShouldClose(routing_id()));
295 } 305 }
296 } 306 }
297 307
298 void RenderViewHost::ClosePage(bool for_cross_site_transition, 308 void RenderViewHost::SwapOut(int new_render_process_host_id,
299 int new_render_process_host_id, 309 int new_request_id) {
300 int new_request_id) { 310 // Start filtering IPC messages to avoid confusing the delegate. This will
301 // This will be set back to false in OnClosePageACK, just before we close the 311 // prevent any dialogs from appearing during unload handlers, but we've
302 // tab or replace it with a pending RVH. There are some cases (such as 204 312 // already decided to silence them in crbug.com/68780. We will set it back
303 // errors) where we'll continue to show this RVH. 313 // to false in SetNavigationsSuspended if we swap back in.
314 is_swapped_out_ = true;
315
316 // This will be set back to false in OnSwapOutACK, just before we replace
317 // this RVH with the pending RVH.
304 is_waiting_for_unload_ack_ = true; 318 is_waiting_for_unload_ack_ = true;
305 // Start the hang monitor in case the renderer hangs in the unload handler. 319 // Start the hang monitor in case the renderer hangs in the unload handler.
306 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); 320 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
307 321
308 ViewMsg_ClosePage_Params params; 322 ViewMsg_SwapOut_Params params;
309 params.closing_process_id = process()->id(); 323 params.closing_process_id = process()->id();
310 params.closing_route_id = routing_id(); 324 params.closing_route_id = routing_id();
311 params.for_cross_site_transition = for_cross_site_transition;
312 params.new_render_process_host_id = new_render_process_host_id; 325 params.new_render_process_host_id = new_render_process_host_id;
313 params.new_request_id = new_request_id; 326 params.new_request_id = new_request_id;
314 if (IsRenderViewLive()) { 327 if (IsRenderViewLive()) {
328 Send(new ViewMsg_SwapOut(routing_id(), params));
329 } else {
330 // This RenderViewHost doesn't have a live renderer, so just skip the unload
331 // event. We must notify the ResourceDispatcherHost on the IO thread,
332 // which we will do through the RenderProcessHost's widget helper.
333 process()->CrossSiteSwapOutACK(params);
334 }
335 }
336
337 void RenderViewHost::OnSwapOutACK() {
338 // Stop the hang monitor now that the unload handler has finished.
339 StopHangMonitorTimeout();
340 is_waiting_for_unload_ack_ = false;
341 }
342
343 void RenderViewHost::WasSwappedOut() {
344 // Don't bother reporting hung state anymore.
345 StopHangMonitorTimeout();
346
347 // Inform the renderer that it can exit if no one else is using it.
348 Send(new ViewMsg_WasSwappedOut(routing_id()));
349 }
350
351 void RenderViewHost::ClosePage() {
352 // Start the hang monitor in case the renderer hangs in the unload handler.
353 is_waiting_for_unload_ack_ = true;
354 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
355
356 if (IsRenderViewLive()) {
357 // TODO(creis): Should this be moved to Shutdown? It may not be called for
358 // RenderViewHosts that have been swapped out.
315 NotificationService::current()->Notify( 359 NotificationService::current()->Notify(
316 NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, 360 NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW,
317 Source<RenderViewHost>(this), 361 Source<RenderViewHost>(this),
318 NotificationService::NoDetails()); 362 NotificationService::NoDetails());
319 363
320 Send(new ViewMsg_ClosePage(routing_id(), params)); 364 Send(new ViewMsg_ClosePage(routing_id()));
321 } else { 365 } else {
322 // This RenderViewHost doesn't have a live renderer, so just skip closing 366 // This RenderViewHost doesn't have a live renderer, so just skip the unload
323 // the page. We must notify the ResourceDispatcherHost on the IO thread, 367 // event and close the page.
324 // which we will do through the RenderProcessHost's widget helper.
325 process()->CrossSiteClosePageACK(params);
326 }
327 }
328
329 void RenderViewHost::OnClosePageACK(bool for_cross_site_transition) {
330 StopHangMonitorTimeout();
331 is_waiting_for_unload_ack_ = false;
332
333 // If this ClosePageACK is not for a cross-site transition, then it is for an
334 // attempt to close the tab. We have now finished the unload handler and can
335 // proceed with closing the tab.
336 if (!for_cross_site_transition) {
337 ClosePageIgnoringUnloadEvents(); 368 ClosePageIgnoringUnloadEvents();
338 } 369 }
339 } 370 }
340 371
341 void RenderViewHost::ClosePageIgnoringUnloadEvents() { 372 void RenderViewHost::ClosePageIgnoringUnloadEvents() {
342 StopHangMonitorTimeout(); 373 StopHangMonitorTimeout();
343 is_waiting_for_beforeunload_ack_ = false; 374 is_waiting_for_beforeunload_ack_ = false;
344 is_waiting_for_unload_ack_ = false; 375 is_waiting_for_unload_ack_ = false;
345 376
346 sudden_termination_allowed_ = true; 377 sudden_termination_allowed_ = true;
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 return sudden_termination_allowed_ || process()->sudden_termination_allowed(); 695 return sudden_termination_allowed_ || process()->sudden_termination_allowed();
665 } 696 }
666 697
667 /////////////////////////////////////////////////////////////////////////////// 698 ///////////////////////////////////////////////////////////////////////////////
668 // RenderViewHost, IPC message handlers: 699 // RenderViewHost, IPC message handlers:
669 700
670 bool RenderViewHost::OnMessageReceived(const IPC::Message& msg) { 701 bool RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
671 if (!BrowserMessageFilter::CheckCanDispatchOnUI(msg, this)) 702 if (!BrowserMessageFilter::CheckCanDispatchOnUI(msg, this))
672 return true; 703 return true;
673 704
705 // Filter out most IPC messages if this renderer is swapped out.
706 // We still want to certain ACKs to keep our state consistent.
707 if (is_swapped_out_)
708 if (!CanHandleWhileSwappedOut(msg))
709 return true;
710
674 { 711 {
675 // delegate_->OnMessageReceived can end up deleting |this|, in which case 712 // delegate_->OnMessageReceived can end up deleting |this|, in which case
676 // the destructor for ObserverListBase::Iterator would access the deleted 713 // the destructor for ObserverListBase::Iterator would access the deleted
677 // observers_. 714 // observers_.
678 ObserverListBase<RenderViewHostObserver>::Iterator it(observers_); 715 ObserverListBase<RenderViewHostObserver>::Iterator it(observers_);
679 RenderViewHostObserver* observer; 716 RenderViewHostObserver* observer;
680 while ((observer = it.GetNext()) != NULL) 717 while ((observer = it.GetNext()) != NULL)
681 if (observer->OnMessageReceived(msg)) 718 if (observer->OnMessageReceived(msg))
682 return true; 719 return true;
683 } 720 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText) 758 IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText)
722 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage, 759 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage,
723 OnMsgRunJavaScriptMessage) 760 OnMsgRunJavaScriptMessage)
724 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm, 761 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm,
725 OnMsgRunBeforeUnloadConfirm) 762 OnMsgRunBeforeUnloadConfirm)
726 IPC_MESSAGE_HANDLER(DragHostMsg_StartDragging, OnMsgStartDragging) 763 IPC_MESSAGE_HANDLER(DragHostMsg_StartDragging, OnMsgStartDragging)
727 IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor) 764 IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor)
728 IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus) 765 IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus)
729 IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole) 766 IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole)
730 IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK) 767 IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK)
768 IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnMsgClosePageACK)
731 IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnMsgSelectionChanged) 769 IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnMsgSelectionChanged)
732 IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityNotifications, 770 IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityNotifications,
733 OnAccessibilityNotifications) 771 OnAccessibilityNotifications)
734 IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted) 772 IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted)
735 IPC_MESSAGE_HANDLER(ViewHostMsg_ContentBlocked, OnContentBlocked) 773 IPC_MESSAGE_HANDLER(ViewHostMsg_ContentBlocked, OnContentBlocked)
736 IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) 774 IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed)
737 IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnMsgFocusedNodeChanged) 775 IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnMsgFocusedNodeChanged)
738 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) 776 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits)
739 IPC_MESSAGE_HANDLER(ViewHostMsg_ScriptEvalResponse, OnScriptEvalResponse) 777 IPC_MESSAGE_HANDLER(ViewHostMsg_ScriptEvalResponse, OnScriptEvalResponse)
740 #if defined(OS_MACOSX) 778 #if defined(OS_MACOSX)
741 IPC_MESSAGE_HANDLER(ViewHostMsg_ShowPopup, OnMsgShowPopup) 779 IPC_MESSAGE_HANDLER(ViewHostMsg_ShowPopup, OnMsgShowPopup)
742 #endif 780 #endif
743 // Have the super handle all other messages. 781 // Have the super handle all other messages.
744 IPC_MESSAGE_UNHANDLED(handled = RenderWidgetHost::OnMessageReceived(msg)) 782 IPC_MESSAGE_UNHANDLED(handled = RenderWidgetHost::OnMessageReceived(msg))
745 IPC_END_MESSAGE_MAP_EX() 783 IPC_END_MESSAGE_MAP_EX()
746 784
747 if (!msg_is_ok) { 785 if (!msg_is_ok) {
748 // The message had a handler, but its de-serialization failed. 786 // The message had a handler, but its de-serialization failed.
749 // Kill the renderer. 787 // Kill the renderer.
750 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_RVH")); 788 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_RVH"));
751 process()->ReceivedBadMessage(); 789 process()->ReceivedBadMessage();
752 } 790 }
753 791
754 return handled; 792 return handled;
755 } 793 }
756 794
795 bool RenderViewHost::CanHandleWhileSwappedOut(const IPC::Message& msg) {
796 // We drop most messages that arrive from a swapped out renderer. However,
797 // some are important (e.g., ACKs) for keeping the browser and renderer state
798 // consistent in case we later return to the renderer.
799 switch (msg.type()) {
800 // Sends an ACK.
801 case ViewHostMsg_ShowView::ID:
802 // Sends an ACK.
803 case ViewHostMsg_ShowWidget::ID:
804 // Sends an ACK.
805 case ViewHostMsg_ShowFullscreenWidget::ID:
806 // Updates browser state.
807 case ViewHostMsg_RenderViewReady::ID:
808 // Updates browser state.
809 case ViewHostMsg_RenderViewGone::ID:
810 // Updates the previous navigation entry.
811 case ViewHostMsg_UpdateState::ID:
812 // Sends an ACK.
813 case ViewHostMsg_UpdateTargetURL::ID:
814 // Updates browser state.
815 case ViewHostMsg_Snapshot::ID:
816 // We allow closing even if we are in the process of swapping out.
817 case ViewHostMsg_Close::ID:
818 // Sends an ACK.
819 case ViewHostMsg_RequestMove::ID:
820 // Updates browser state, and important for tests.
821 case ViewHostMsg_DomOperationResponse::ID:
822 // Suppresses dialog and sends an ACK.
823 case ViewHostMsg_RunJavaScriptMessage::ID:
824 // Suppresses dialog and sends an ACK.
825 case ViewHostMsg_RunBeforeUnloadConfirm::ID:
826 // Stops hang monitor.
827 case ViewHostMsg_ShouldClose_ACK::ID:
828 // We allow closing even if we are in the process of swapping out.
829 case ViewHostMsg_ClosePage_ACK::ID:
830 // Sends an ACK.
831 case ViewHostMsg_AccessibilityNotifications::ID:
832 // Updates browser state.
833 case ViewHostMsg_PaintAtSize_ACK::ID:
834 // Updates browser state.
835 case ViewHostMsg_HandleInputEvent_ACK::ID:
836 // Updates browser state.
837 case ViewHostMsg_UpdateRect::ID:
838 return true;
839 default:
840 break;
841 }
842 return false;
843 }
844
757 void RenderViewHost::Shutdown() { 845 void RenderViewHost::Shutdown() {
758 // If we are being run modally (see RunModal), then we need to cleanup. 846 // If we are being run modally (see RunModal), then we need to cleanup.
759 if (run_modal_reply_msg_) { 847 if (run_modal_reply_msg_) {
760 Send(run_modal_reply_msg_); 848 Send(run_modal_reply_msg_);
761 run_modal_reply_msg_ = NULL; 849 run_modal_reply_msg_ = NULL;
762 } 850 }
763 851
764 RenderWidgetHost::Shutdown(); 852 RenderWidgetHost::Shutdown();
765 } 853 }
766 854
(...skipping 23 matching lines...) Expand all
790 if (view) 878 if (view)
791 view->CreateNewFullscreenWidget(route_id); 879 view->CreateNewFullscreenWidget(route_id);
792 } 880 }
793 881
794 void RenderViewHost::OnMsgShowView(int route_id, 882 void RenderViewHost::OnMsgShowView(int route_id,
795 WindowOpenDisposition disposition, 883 WindowOpenDisposition disposition,
796 const gfx::Rect& initial_pos, 884 const gfx::Rect& initial_pos,
797 bool user_gesture) { 885 bool user_gesture) {
798 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 886 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
799 if (view) { 887 if (view) {
800 view->ShowCreatedWindow(route_id, disposition, initial_pos, user_gesture); 888 if (!is_swapped_out_)
889 view->ShowCreatedWindow(route_id, disposition, initial_pos, user_gesture);
801 Send(new ViewMsg_Move_ACK(route_id)); 890 Send(new ViewMsg_Move_ACK(route_id));
802 } 891 }
803 } 892 }
804 893
805 void RenderViewHost::OnMsgShowWidget(int route_id, 894 void RenderViewHost::OnMsgShowWidget(int route_id,
806 const gfx::Rect& initial_pos) { 895 const gfx::Rect& initial_pos) {
807 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 896 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
808 if (view) { 897 if (view) {
809 view->ShowCreatedWidget(route_id, initial_pos); 898 if (!is_swapped_out_)
899 view->ShowCreatedWidget(route_id, initial_pos);
810 Send(new ViewMsg_Move_ACK(route_id)); 900 Send(new ViewMsg_Move_ACK(route_id));
811 } 901 }
812 } 902 }
813 903
814 void RenderViewHost::OnMsgShowFullscreenWidget(int route_id) { 904 void RenderViewHost::OnMsgShowFullscreenWidget(int route_id) {
815 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 905 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
816 if (view) { 906 if (view) {
817 view->ShowCreatedFullscreenWidget(route_id); 907 if (!is_swapped_out_)
908 view->ShowCreatedFullscreenWidget(route_id);
818 Send(new ViewMsg_Move_ACK(route_id)); 909 Send(new ViewMsg_Move_ACK(route_id));
819 } 910 }
820 } 911 }
821 912
822 void RenderViewHost::OnMsgRunModal(IPC::Message* reply_msg) { 913 void RenderViewHost::OnMsgRunModal(IPC::Message* reply_msg) {
823 DCHECK(!run_modal_reply_msg_); 914 DCHECK(!run_modal_reply_msg_);
824 run_modal_reply_msg_ = reply_msg; 915 run_modal_reply_msg_ = reply_msg;
825 916
826 // TODO(darin): Bug 1107929: Need to inform our delegate to show this view in 917 // TODO(darin): Bug 1107929: Need to inform our delegate to show this view in
827 // an app-modal fashion. 918 // an app-modal fashion.
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 } 1020 }
930 delegate_->UpdateTitle(this, page_id, title); 1021 delegate_->UpdateTitle(this, page_id, title);
931 } 1022 }
932 1023
933 void RenderViewHost::OnMsgUpdateEncoding(const std::string& encoding_name) { 1024 void RenderViewHost::OnMsgUpdateEncoding(const std::string& encoding_name) {
934 delegate_->UpdateEncoding(this, encoding_name); 1025 delegate_->UpdateEncoding(this, encoding_name);
935 } 1026 }
936 1027
937 void RenderViewHost::OnMsgUpdateTargetURL(int32 page_id, 1028 void RenderViewHost::OnMsgUpdateTargetURL(int32 page_id,
938 const GURL& url) { 1029 const GURL& url) {
939 delegate_->UpdateTargetURL(page_id, url); 1030 if (!is_swapped_out_)
1031 delegate_->UpdateTargetURL(page_id, url);
940 1032
941 // Send a notification back to the renderer that we are ready to 1033 // Send a notification back to the renderer that we are ready to
942 // receive more target urls. 1034 // receive more target urls.
943 Send(new ViewMsg_UpdateTargetURL_ACK(routing_id())); 1035 Send(new ViewMsg_UpdateTargetURL_ACK(routing_id()));
944 } 1036 }
945 1037
946 void RenderViewHost::OnUpdateInspectorSetting( 1038 void RenderViewHost::OnUpdateInspectorSetting(
947 const std::string& key, const std::string& value) { 1039 const std::string& key, const std::string& value) {
948 delegate_->UpdateInspectorSetting(key, value); 1040 delegate_->UpdateInspectorSetting(key, value);
949 } 1041 }
950 1042
951 void RenderViewHost::OnMsgClose() { 1043 void RenderViewHost::OnMsgClose() {
952 // If the renderer is telling us to close, it has already run the unload 1044 // If the renderer is telling us to close, it has already run the unload
953 // events, and we can take the fast path. 1045 // events, and we can take the fast path.
954 ClosePageIgnoringUnloadEvents(); 1046 ClosePageIgnoringUnloadEvents();
955 } 1047 }
956 1048
957 void RenderViewHost::OnMsgRequestMove(const gfx::Rect& pos) { 1049 void RenderViewHost::OnMsgRequestMove(const gfx::Rect& pos) {
958 delegate_->RequestMove(pos); 1050 if (!is_swapped_out_)
1051 delegate_->RequestMove(pos);
959 Send(new ViewMsg_Move_ACK(routing_id())); 1052 Send(new ViewMsg_Move_ACK(routing_id()));
960 } 1053 }
961 1054
962 void RenderViewHost::OnMsgDidStartLoading() { 1055 void RenderViewHost::OnMsgDidStartLoading() {
963 delegate_->DidStartLoading(); 1056 delegate_->DidStartLoading();
964 } 1057 }
965 1058
966 void RenderViewHost::OnMsgDidStopLoading() { 1059 void RenderViewHost::OnMsgDidStopLoading() {
967 delegate_->DidStopLoading(); 1060 delegate_->DidStopLoading();
968 } 1061 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 void RenderViewHost::OnMsgRunJavaScriptMessage( 1163 void RenderViewHost::OnMsgRunJavaScriptMessage(
1071 const std::wstring& message, 1164 const std::wstring& message,
1072 const std::wstring& default_prompt, 1165 const std::wstring& default_prompt,
1073 const GURL& frame_url, 1166 const GURL& frame_url,
1074 const int flags, 1167 const int flags,
1075 IPC::Message* reply_msg) { 1168 IPC::Message* reply_msg) {
1076 // While a JS message dialog is showing, tabs in the same process shouldn't 1169 // While a JS message dialog is showing, tabs in the same process shouldn't
1077 // process input events. 1170 // process input events.
1078 process()->set_ignore_input_events(true); 1171 process()->set_ignore_input_events(true);
1079 StopHangMonitorTimeout(); 1172 StopHangMonitorTimeout();
1080 delegate_->RunJavaScriptMessage(message, default_prompt, frame_url, flags, 1173 delegate_->RunJavaScriptMessage(this, message, default_prompt, frame_url,
1081 reply_msg, 1174 flags, reply_msg,
1082 &are_javascript_messages_suppressed_); 1175 &are_javascript_messages_suppressed_);
1083 } 1176 }
1084 1177
1085 void RenderViewHost::OnMsgRunBeforeUnloadConfirm(const GURL& frame_url, 1178 void RenderViewHost::OnMsgRunBeforeUnloadConfirm(const GURL& frame_url,
1086 const std::wstring& message, 1179 const std::wstring& message,
1087 IPC::Message* reply_msg) { 1180 IPC::Message* reply_msg) {
1088 // While a JS before unload dialog is showing, tabs in the same process 1181 // While a JS before unload dialog is showing, tabs in the same process
1089 // shouldn't process input events. 1182 // shouldn't process input events.
1090 process()->set_ignore_input_events(true); 1183 process()->set_ignore_input_events(true);
1091 StopHangMonitorTimeout(); 1184 StopHangMonitorTimeout();
1092 delegate_->RunBeforeUnloadConfirm(message, reply_msg); 1185 delegate_->RunBeforeUnloadConfirm(this, message, reply_msg);
1093 } 1186 }
1094 1187
1095 void RenderViewHost::MediaPlayerActionAt(const gfx::Point& location, 1188 void RenderViewHost::MediaPlayerActionAt(const gfx::Point& location,
1096 const WebMediaPlayerAction& action) { 1189 const WebMediaPlayerAction& action) {
1097 // TODO(ajwong): Which thread should run this? Does it matter? 1190 // TODO(ajwong): Which thread should run this? Does it matter?
1098 Send(new ViewMsg_MediaPlayerActionAt(routing_id(), location, action)); 1191 Send(new ViewMsg_MediaPlayerActionAt(routing_id(), location, action));
1099 } 1192 }
1100 1193
1101 void RenderViewHost::ContextMenuClosed( 1194 void RenderViewHost::ContextMenuClosed(
1102 const webkit_glue::CustomContextMenuContext& custom_context) { 1195 const webkit_glue::CustomContextMenuContext& custom_context) {
1103 Send(new ViewMsg_ContextMenuClosed(routing_id(), custom_context)); 1196 Send(new ViewMsg_ContextMenuClosed(routing_id(), custom_context));
1104 } 1197 }
1105 1198
1106 void RenderViewHost::OnMsgStartDragging( 1199 void RenderViewHost::OnMsgStartDragging(
1107 const WebDropData& drop_data, 1200 const WebDropData& drop_data,
1108 WebDragOperationsMask drag_operations_mask, 1201 WebDragOperationsMask drag_operations_mask,
1109 const SkBitmap& image, 1202 const SkBitmap& image,
1110 const gfx::Point& image_offset) { 1203 const gfx::Point& image_offset) {
1111 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 1204 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
1112 if (view) 1205 if (view)
1113 view->StartDragging(drop_data, drag_operations_mask, image, image_offset); 1206 view->StartDragging(drop_data, drag_operations_mask, image, image_offset);
1114 } 1207 }
1115 1208
1116 void RenderViewHost::OnUpdateDragCursor(WebDragOperation current_op) { 1209 void RenderViewHost::OnUpdateDragCursor(WebDragOperation current_op) {
1117 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 1210 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
1118 if (view) 1211 if (view)
1119 view->UpdateDragCursor(current_op); 1212 view->UpdateDragCursor(current_op);
1120 } 1213 }
1121 1214
1122 void RenderViewHost::OnTakeFocus(bool reverse) { 1215 void RenderViewHost::OnTakeFocus(bool reverse) {
1123 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 1216 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 1253
1161 void RenderViewHost::OnUserGesture() { 1254 void RenderViewHost::OnUserGesture() {
1162 delegate_->OnUserGesture(); 1255 delegate_->OnUserGesture();
1163 } 1256 }
1164 1257
1165 void RenderViewHost::OnMsgShouldCloseACK(bool proceed) { 1258 void RenderViewHost::OnMsgShouldCloseACK(bool proceed) {
1166 StopHangMonitorTimeout(); 1259 StopHangMonitorTimeout();
1167 // If this renderer navigated while the beforeunload request was in flight, we 1260 // If this renderer navigated while the beforeunload request was in flight, we
1168 // may have cleared this state in OnMsgNavigate, in which case we can ignore 1261 // may have cleared this state in OnMsgNavigate, in which case we can ignore
1169 // this message. 1262 // this message.
1170 if (!is_waiting_for_beforeunload_ack_) 1263 if (!is_waiting_for_beforeunload_ack_ || is_swapped_out_)
1171 return; 1264 return;
1172 1265
1173 is_waiting_for_beforeunload_ack_ = false; 1266 is_waiting_for_beforeunload_ack_ = false;
1174 1267
1175 RenderViewHostDelegate::RendererManagement* management_delegate = 1268 RenderViewHostDelegate::RendererManagement* management_delegate =
1176 delegate_->GetRendererManagementDelegate(); 1269 delegate_->GetRendererManagementDelegate();
1177 if (management_delegate) { 1270 if (management_delegate) {
1178 management_delegate->ShouldClosePage( 1271 management_delegate->ShouldClosePage(
1179 unload_ack_is_for_cross_site_transition_, proceed); 1272 unload_ack_is_for_cross_site_transition_, proceed);
1180 } 1273 }
1181 1274
1182 // If canceled, notify the delegate to cancel its pending navigation entry. 1275 // If canceled, notify the delegate to cancel its pending navigation entry.
1183 if (!proceed) 1276 if (!proceed)
1184 delegate_->DidCancelLoading(); 1277 delegate_->DidCancelLoading();
1185 } 1278 }
1186 1279
1280 void RenderViewHost::OnMsgClosePageACK() {
1281 ClosePageIgnoringUnloadEvents();
1282 }
1283
1187 void RenderViewHost::WindowMoveOrResizeStarted() { 1284 void RenderViewHost::WindowMoveOrResizeStarted() {
1188 Send(new ViewMsg_MoveOrResizeStarted(routing_id())); 1285 Send(new ViewMsg_MoveOrResizeStarted(routing_id()));
1189 } 1286 }
1190 1287
1191 void RenderViewHost::NotifyRendererUnresponsive() { 1288 void RenderViewHost::NotifyRendererUnresponsive() {
1192 delegate_->RendererUnresponsive( 1289 delegate_->RendererUnresponsive(
1193 this, is_waiting_for_beforeunload_ack_ || is_waiting_for_unload_ack_); 1290 this, is_waiting_for_beforeunload_ack_ || is_waiting_for_unload_ack_);
1194 } 1291 }
1195 1292
1196 void RenderViewHost::NotifyRendererResponsive() { 1293 void RenderViewHost::NotifyRendererResponsive() {
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 // If this renderer is not permitted to request this URL, we invalidate the 1416 // If this renderer is not permitted to request this URL, we invalidate the
1320 // URL. This prevents us from storing the blocked URL and becoming confused 1417 // URL. This prevents us from storing the blocked URL and becoming confused
1321 // later. 1418 // later.
1322 VLOG(1) << "Blocked URL " << url->spec(); 1419 VLOG(1) << "Blocked URL " << url->spec();
1323 *url = GURL(); 1420 *url = GURL();
1324 } 1421 }
1325 } 1422 }
1326 1423
1327 void RenderViewHost::OnAccessibilityNotifications( 1424 void RenderViewHost::OnAccessibilityNotifications(
1328 const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) { 1425 const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) {
1329 if (view()) 1426 if (view() && !is_swapped_out_)
1330 view()->OnAccessibilityNotifications(params); 1427 view()->OnAccessibilityNotifications(params);
1331 1428
1332 if (!params.empty()) { 1429 if (!params.empty()) {
1333 for (unsigned i = 0; i < params.size(); i++) { 1430 for (unsigned i = 0; i < params.size(); i++) {
1334 const ViewHostMsg_AccessibilityNotification_Params& param = params[i]; 1431 const ViewHostMsg_AccessibilityNotification_Params& param = params[i];
1335 1432
1336 if (param.notification_type == 1433 if (param.notification_type ==
1337 ViewHostMsg_AccessibilityNotification_Type:: 1434 ViewHostMsg_AccessibilityNotification_Type::
1338 NOTIFICATION_TYPE_LOAD_COMPLETE) { 1435 NOTIFICATION_TYPE_LOAD_COMPLETE) {
1339 // TODO(ctguil): Remove when mac processes OnAccessibilityNotifications. 1436 // TODO(ctguil): Remove when mac processes OnAccessibilityNotifications.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 if (view) { 1499 if (view) {
1403 view->ShowPopupMenu(params.bounds, 1500 view->ShowPopupMenu(params.bounds,
1404 params.item_height, 1501 params.item_height,
1405 params.item_font_size, 1502 params.item_font_size,
1406 params.selected_item, 1503 params.selected_item,
1407 params.popup_items, 1504 params.popup_items,
1408 params.right_aligned); 1505 params.right_aligned);
1409 } 1506 }
1410 } 1507 }
1411 #endif 1508 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698