OLD | NEW |
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 21 matching lines...) Expand all Loading... |
32 #include "content/browser/site_instance.h" | 32 #include "content/browser/site_instance.h" |
33 #include "content/browser/user_metrics.h" | 33 #include "content/browser/user_metrics.h" |
34 #include "content/common/bindings_policy.h" | 34 #include "content/common/bindings_policy.h" |
35 #include "content/common/content_constants.h" | 35 #include "content/common/content_constants.h" |
36 #include "content/common/drag_messages.h" | 36 #include "content/common/drag_messages.h" |
37 #include "content/common/native_web_keyboard_event.h" | 37 #include "content/common/native_web_keyboard_event.h" |
38 #include "content/common/notification_details.h" | 38 #include "content/common/notification_details.h" |
39 #include "content/common/notification_service.h" | 39 #include "content/common/notification_service.h" |
40 #include "content/common/notification_type.h" | 40 #include "content/common/notification_type.h" |
41 #include "content/common/result_codes.h" | 41 #include "content/common/result_codes.h" |
| 42 #include "content/common/swapped_out_messages.h" |
42 #include "content/common/url_constants.h" | 43 #include "content/common/url_constants.h" |
43 #include "content/common/view_messages.h" | 44 #include "content/common/view_messages.h" |
44 #include "net/base/net_util.h" | 45 #include "net/base/net_util.h" |
45 #include "net/url_request/url_request_context_getter.h" | 46 #include "net/url_request/url_request_context_getter.h" |
46 #include "third_party/skia/include/core/SkBitmap.h" | 47 #include "third_party/skia/include/core/SkBitmap.h" |
47 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFindOptions.h" | 48 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFindOptions.h" |
48 #include "ui/gfx/native_widget_types.h" | 49 #include "ui/gfx/native_widget_types.h" |
49 #include "webkit/glue/context_menu.h" | 50 #include "webkit/glue/context_menu.h" |
50 #include "webkit/glue/webaccessibility.h" | 51 #include "webkit/glue/webaccessibility.h" |
51 #include "webkit/glue/webdropdata.h" | 52 #include "webkit/glue/webdropdata.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 | 86 |
86 RenderViewHost::RenderViewHost(SiteInstance* instance, | 87 RenderViewHost::RenderViewHost(SiteInstance* instance, |
87 RenderViewHostDelegate* delegate, | 88 RenderViewHostDelegate* delegate, |
88 int routing_id, | 89 int routing_id, |
89 SessionStorageNamespace* session_storage) | 90 SessionStorageNamespace* session_storage) |
90 : RenderWidgetHost(instance->GetProcess(), routing_id), | 91 : RenderWidgetHost(instance->GetProcess(), routing_id), |
91 instance_(instance), | 92 instance_(instance), |
92 delegate_(delegate), | 93 delegate_(delegate), |
93 waiting_for_drag_context_response_(false), | 94 waiting_for_drag_context_response_(false), |
94 enabled_bindings_(0), | 95 enabled_bindings_(0), |
95 pending_request_id_(0), | 96 pending_request_id_(-1), |
96 navigations_suspended_(false), | 97 navigations_suspended_(false), |
97 suspended_nav_message_(NULL), | 98 suspended_nav_message_(NULL), |
| 99 is_swapped_out_(false), |
98 run_modal_reply_msg_(NULL), | 100 run_modal_reply_msg_(NULL), |
99 is_waiting_for_beforeunload_ack_(false), | 101 is_waiting_for_beforeunload_ack_(false), |
100 is_waiting_for_unload_ack_(false), | 102 is_waiting_for_unload_ack_(false), |
101 unload_ack_is_for_cross_site_transition_(false), | 103 unload_ack_is_for_cross_site_transition_(false), |
102 are_javascript_messages_suppressed_(false), | 104 are_javascript_messages_suppressed_(false), |
103 sudden_termination_allowed_(false), | 105 sudden_termination_allowed_(false), |
104 session_storage_namespace_(session_storage), | 106 session_storage_namespace_(session_storage), |
105 save_accessibility_tree_for_testing_(false), | 107 save_accessibility_tree_for_testing_(false), |
106 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING) { | 108 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING) { |
107 if (!session_storage_namespace_) { | 109 if (!session_storage_namespace_) { |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 Navigate(params); | 253 Navigate(params); |
252 } | 254 } |
253 | 255 |
254 void RenderViewHost::SetNavigationsSuspended(bool suspend) { | 256 void RenderViewHost::SetNavigationsSuspended(bool suspend) { |
255 // This should only be called to toggle the state. | 257 // This should only be called to toggle the state. |
256 DCHECK(navigations_suspended_ != suspend); | 258 DCHECK(navigations_suspended_ != suspend); |
257 | 259 |
258 navigations_suspended_ = suspend; | 260 navigations_suspended_ = suspend; |
259 if (!suspend && suspended_nav_message_.get()) { | 261 if (!suspend && suspended_nav_message_.get()) { |
260 // There's a navigation message waiting to be sent. Now that we're not | 262 // There's a navigation message waiting to be sent. Now that we're not |
261 // suspended anymore, resume navigation by sending it. | 263 // suspended anymore, resume navigation by sending it. If we were swapped |
| 264 // out, we should also stop filtering out the IPC messages now. |
| 265 is_swapped_out_ = false; |
262 Send(suspended_nav_message_.release()); | 266 Send(suspended_nav_message_.release()); |
263 } | 267 } |
264 } | 268 } |
265 | 269 |
| 270 void RenderViewHost::CancelSuspendedNavigations() { |
| 271 // Clear any state if a pending navigation is canceled or pre-empted. |
| 272 if (suspended_nav_message_.get()) |
| 273 suspended_nav_message_.reset(); |
| 274 navigations_suspended_ = false; |
| 275 } |
| 276 |
266 void RenderViewHost::FirePageBeforeUnload(bool for_cross_site_transition) { | 277 void RenderViewHost::FirePageBeforeUnload(bool for_cross_site_transition) { |
267 if (!IsRenderViewLive()) { | 278 if (!IsRenderViewLive()) { |
268 // This RenderViewHost doesn't have a live renderer, so just skip running | 279 // This RenderViewHost doesn't have a live renderer, so just skip running |
269 // the onbeforeunload handler. | 280 // the onbeforeunload handler. |
270 is_waiting_for_beforeunload_ack_ = true; // Checked by OnMsgShouldCloseACK. | 281 is_waiting_for_beforeunload_ack_ = true; // Checked by OnMsgShouldCloseACK. |
271 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; | 282 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; |
272 OnMsgShouldCloseACK(true); | 283 OnMsgShouldCloseACK(true); |
273 return; | 284 return; |
274 } | 285 } |
275 | 286 |
(...skipping 12 matching lines...) Expand all Loading... |
288 } else { | 299 } else { |
289 // Start the hang monitor in case the renderer hangs in the beforeunload | 300 // Start the hang monitor in case the renderer hangs in the beforeunload |
290 // handler. | 301 // handler. |
291 is_waiting_for_beforeunload_ack_ = true; | 302 is_waiting_for_beforeunload_ack_ = true; |
292 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; | 303 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; |
293 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); | 304 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
294 Send(new ViewMsg_ShouldClose(routing_id())); | 305 Send(new ViewMsg_ShouldClose(routing_id())); |
295 } | 306 } |
296 } | 307 } |
297 | 308 |
298 void RenderViewHost::ClosePage(bool for_cross_site_transition, | 309 void RenderViewHost::SwapOut(int new_render_process_host_id, |
299 int new_render_process_host_id, | 310 int new_request_id) { |
300 int new_request_id) { | 311 // 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 | 312 // 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 | 313 // already decided to silence them in crbug.com/68780. We will set it back |
303 // errors) where we'll continue to show this RVH. | 314 // to false in SetNavigationsSuspended if we swap back in. |
| 315 is_swapped_out_ = true; |
| 316 |
| 317 // This will be set back to false in OnSwapOutACK, just before we replace |
| 318 // this RVH with the pending RVH. |
304 is_waiting_for_unload_ack_ = true; | 319 is_waiting_for_unload_ack_ = true; |
305 // Start the hang monitor in case the renderer hangs in the unload handler. | 320 // Start the hang monitor in case the renderer hangs in the unload handler. |
306 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); | 321 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
307 | 322 |
308 ViewMsg_ClosePage_Params params; | 323 ViewMsg_SwapOut_Params params; |
309 params.closing_process_id = process()->id(); | 324 params.closing_process_id = process()->id(); |
310 params.closing_route_id = routing_id(); | 325 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; | 326 params.new_render_process_host_id = new_render_process_host_id; |
313 params.new_request_id = new_request_id; | 327 params.new_request_id = new_request_id; |
314 if (IsRenderViewLive()) { | 328 if (IsRenderViewLive()) { |
| 329 Send(new ViewMsg_SwapOut(routing_id(), params)); |
| 330 } else { |
| 331 // This RenderViewHost doesn't have a live renderer, so just skip the unload |
| 332 // event. We must notify the ResourceDispatcherHost on the IO thread, |
| 333 // which we will do through the RenderProcessHost's widget helper. |
| 334 process()->CrossSiteSwapOutACK(params); |
| 335 } |
| 336 } |
| 337 |
| 338 void RenderViewHost::OnSwapOutACK() { |
| 339 // Stop the hang monitor now that the unload handler has finished. |
| 340 StopHangMonitorTimeout(); |
| 341 is_waiting_for_unload_ack_ = false; |
| 342 } |
| 343 |
| 344 void RenderViewHost::WasSwappedOut() { |
| 345 // Don't bother reporting hung state anymore. |
| 346 StopHangMonitorTimeout(); |
| 347 |
| 348 // Inform the renderer that it can exit if no one else is using it. |
| 349 Send(new ViewMsg_WasSwappedOut(routing_id())); |
| 350 } |
| 351 |
| 352 void RenderViewHost::ClosePage() { |
| 353 // Start the hang monitor in case the renderer hangs in the unload handler. |
| 354 is_waiting_for_unload_ack_ = true; |
| 355 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
| 356 |
| 357 if (IsRenderViewLive()) { |
| 358 // TODO(creis): Should this be moved to Shutdown? It may not be called for |
| 359 // RenderViewHosts that have been swapped out. |
315 NotificationService::current()->Notify( | 360 NotificationService::current()->Notify( |
316 NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, | 361 NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, |
317 Source<RenderViewHost>(this), | 362 Source<RenderViewHost>(this), |
318 NotificationService::NoDetails()); | 363 NotificationService::NoDetails()); |
319 | 364 |
320 Send(new ViewMsg_ClosePage(routing_id(), params)); | 365 Send(new ViewMsg_ClosePage(routing_id())); |
321 } else { | 366 } else { |
322 // This RenderViewHost doesn't have a live renderer, so just skip closing | 367 // 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, | 368 // 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(); | 369 ClosePageIgnoringUnloadEvents(); |
338 } | 370 } |
339 } | 371 } |
340 | 372 |
341 void RenderViewHost::ClosePageIgnoringUnloadEvents() { | 373 void RenderViewHost::ClosePageIgnoringUnloadEvents() { |
342 StopHangMonitorTimeout(); | 374 StopHangMonitorTimeout(); |
343 is_waiting_for_beforeunload_ack_ = false; | 375 is_waiting_for_beforeunload_ack_ = false; |
344 is_waiting_for_unload_ack_ = false; | 376 is_waiting_for_unload_ack_ = false; |
345 | 377 |
346 sudden_termination_allowed_ = true; | 378 sudden_termination_allowed_ = true; |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 return sudden_termination_allowed_ || process()->sudden_termination_allowed(); | 696 return sudden_termination_allowed_ || process()->sudden_termination_allowed(); |
665 } | 697 } |
666 | 698 |
667 /////////////////////////////////////////////////////////////////////////////// | 699 /////////////////////////////////////////////////////////////////////////////// |
668 // RenderViewHost, IPC message handlers: | 700 // RenderViewHost, IPC message handlers: |
669 | 701 |
670 bool RenderViewHost::OnMessageReceived(const IPC::Message& msg) { | 702 bool RenderViewHost::OnMessageReceived(const IPC::Message& msg) { |
671 if (!BrowserMessageFilter::CheckCanDispatchOnUI(msg, this)) | 703 if (!BrowserMessageFilter::CheckCanDispatchOnUI(msg, this)) |
672 return true; | 704 return true; |
673 | 705 |
| 706 // Filter out most IPC messages if this renderer is swapped out. |
| 707 // We still want to certain ACKs to keep our state consistent. |
| 708 if (is_swapped_out_) |
| 709 if (!content::SwappedOutMessages::CanHandleWhileSwappedOut(msg)) |
| 710 return true; |
| 711 |
674 { | 712 { |
675 // delegate_->OnMessageReceived can end up deleting |this|, in which case | 713 // delegate_->OnMessageReceived can end up deleting |this|, in which case |
676 // the destructor for ObserverListBase::Iterator would access the deleted | 714 // the destructor for ObserverListBase::Iterator would access the deleted |
677 // observers_. | 715 // observers_. |
678 ObserverListBase<RenderViewHostObserver>::Iterator it(observers_); | 716 ObserverListBase<RenderViewHostObserver>::Iterator it(observers_); |
679 RenderViewHostObserver* observer; | 717 RenderViewHostObserver* observer; |
680 while ((observer = it.GetNext()) != NULL) | 718 while ((observer = it.GetNext()) != NULL) |
681 if (observer->OnMessageReceived(msg)) | 719 if (observer->OnMessageReceived(msg)) |
682 return true; | 720 return true; |
683 } | 721 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText) | 759 IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText) |
722 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage, | 760 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage, |
723 OnMsgRunJavaScriptMessage) | 761 OnMsgRunJavaScriptMessage) |
724 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm, | 762 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm, |
725 OnMsgRunBeforeUnloadConfirm) | 763 OnMsgRunBeforeUnloadConfirm) |
726 IPC_MESSAGE_HANDLER(DragHostMsg_StartDragging, OnMsgStartDragging) | 764 IPC_MESSAGE_HANDLER(DragHostMsg_StartDragging, OnMsgStartDragging) |
727 IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor) | 765 IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor) |
728 IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus) | 766 IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus) |
729 IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole) | 767 IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole) |
730 IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK) | 768 IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK) |
| 769 IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnMsgClosePageACK) |
731 IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnMsgSelectionChanged) | 770 IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnMsgSelectionChanged) |
732 IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityNotifications, | 771 IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityNotifications, |
733 OnAccessibilityNotifications) | 772 OnAccessibilityNotifications) |
734 IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted) | 773 IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted) |
735 IPC_MESSAGE_HANDLER(ViewHostMsg_ContentBlocked, OnContentBlocked) | 774 IPC_MESSAGE_HANDLER(ViewHostMsg_ContentBlocked, OnContentBlocked) |
736 IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) | 775 IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) |
737 IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnMsgFocusedNodeChanged) | 776 IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnMsgFocusedNodeChanged) |
738 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) | 777 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) |
739 IPC_MESSAGE_HANDLER(ViewHostMsg_ScriptEvalResponse, OnScriptEvalResponse) | 778 IPC_MESSAGE_HANDLER(ViewHostMsg_ScriptEvalResponse, OnScriptEvalResponse) |
740 #if defined(OS_MACOSX) | 779 #if defined(OS_MACOSX) |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 if (view) | 829 if (view) |
791 view->CreateNewFullscreenWidget(route_id); | 830 view->CreateNewFullscreenWidget(route_id); |
792 } | 831 } |
793 | 832 |
794 void RenderViewHost::OnMsgShowView(int route_id, | 833 void RenderViewHost::OnMsgShowView(int route_id, |
795 WindowOpenDisposition disposition, | 834 WindowOpenDisposition disposition, |
796 const gfx::Rect& initial_pos, | 835 const gfx::Rect& initial_pos, |
797 bool user_gesture) { | 836 bool user_gesture) { |
798 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 837 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
799 if (view) { | 838 if (view) { |
800 view->ShowCreatedWindow(route_id, disposition, initial_pos, user_gesture); | 839 if (!is_swapped_out_) |
| 840 view->ShowCreatedWindow(route_id, disposition, initial_pos, user_gesture); |
801 Send(new ViewMsg_Move_ACK(route_id)); | 841 Send(new ViewMsg_Move_ACK(route_id)); |
802 } | 842 } |
803 } | 843 } |
804 | 844 |
805 void RenderViewHost::OnMsgShowWidget(int route_id, | 845 void RenderViewHost::OnMsgShowWidget(int route_id, |
806 const gfx::Rect& initial_pos) { | 846 const gfx::Rect& initial_pos) { |
807 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 847 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
808 if (view) { | 848 if (view) { |
809 view->ShowCreatedWidget(route_id, initial_pos); | 849 if (!is_swapped_out_) |
| 850 view->ShowCreatedWidget(route_id, initial_pos); |
810 Send(new ViewMsg_Move_ACK(route_id)); | 851 Send(new ViewMsg_Move_ACK(route_id)); |
811 } | 852 } |
812 } | 853 } |
813 | 854 |
814 void RenderViewHost::OnMsgShowFullscreenWidget(int route_id) { | 855 void RenderViewHost::OnMsgShowFullscreenWidget(int route_id) { |
815 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 856 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
816 if (view) { | 857 if (view) { |
817 view->ShowCreatedFullscreenWidget(route_id); | 858 if (!is_swapped_out_) |
| 859 view->ShowCreatedFullscreenWidget(route_id); |
818 Send(new ViewMsg_Move_ACK(route_id)); | 860 Send(new ViewMsg_Move_ACK(route_id)); |
819 } | 861 } |
820 } | 862 } |
821 | 863 |
822 void RenderViewHost::OnMsgRunModal(IPC::Message* reply_msg) { | 864 void RenderViewHost::OnMsgRunModal(IPC::Message* reply_msg) { |
823 DCHECK(!run_modal_reply_msg_); | 865 DCHECK(!run_modal_reply_msg_); |
824 run_modal_reply_msg_ = reply_msg; | 866 run_modal_reply_msg_ = reply_msg; |
825 | 867 |
826 // TODO(darin): Bug 1107929: Need to inform our delegate to show this view in | 868 // TODO(darin): Bug 1107929: Need to inform our delegate to show this view in |
827 // an app-modal fashion. | 869 // an app-modal fashion. |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 } | 971 } |
930 delegate_->UpdateTitle(this, page_id, title); | 972 delegate_->UpdateTitle(this, page_id, title); |
931 } | 973 } |
932 | 974 |
933 void RenderViewHost::OnMsgUpdateEncoding(const std::string& encoding_name) { | 975 void RenderViewHost::OnMsgUpdateEncoding(const std::string& encoding_name) { |
934 delegate_->UpdateEncoding(this, encoding_name); | 976 delegate_->UpdateEncoding(this, encoding_name); |
935 } | 977 } |
936 | 978 |
937 void RenderViewHost::OnMsgUpdateTargetURL(int32 page_id, | 979 void RenderViewHost::OnMsgUpdateTargetURL(int32 page_id, |
938 const GURL& url) { | 980 const GURL& url) { |
939 delegate_->UpdateTargetURL(page_id, url); | 981 if (!is_swapped_out_) |
| 982 delegate_->UpdateTargetURL(page_id, url); |
940 | 983 |
941 // Send a notification back to the renderer that we are ready to | 984 // Send a notification back to the renderer that we are ready to |
942 // receive more target urls. | 985 // receive more target urls. |
943 Send(new ViewMsg_UpdateTargetURL_ACK(routing_id())); | 986 Send(new ViewMsg_UpdateTargetURL_ACK(routing_id())); |
944 } | 987 } |
945 | 988 |
946 void RenderViewHost::OnUpdateInspectorSetting( | 989 void RenderViewHost::OnUpdateInspectorSetting( |
947 const std::string& key, const std::string& value) { | 990 const std::string& key, const std::string& value) { |
948 delegate_->UpdateInspectorSetting(key, value); | 991 delegate_->UpdateInspectorSetting(key, value); |
949 } | 992 } |
950 | 993 |
951 void RenderViewHost::OnMsgClose() { | 994 void RenderViewHost::OnMsgClose() { |
952 // If the renderer is telling us to close, it has already run the unload | 995 // If the renderer is telling us to close, it has already run the unload |
953 // events, and we can take the fast path. | 996 // events, and we can take the fast path. |
954 ClosePageIgnoringUnloadEvents(); | 997 ClosePageIgnoringUnloadEvents(); |
955 } | 998 } |
956 | 999 |
957 void RenderViewHost::OnMsgRequestMove(const gfx::Rect& pos) { | 1000 void RenderViewHost::OnMsgRequestMove(const gfx::Rect& pos) { |
958 delegate_->RequestMove(pos); | 1001 if (!is_swapped_out_) |
| 1002 delegate_->RequestMove(pos); |
959 Send(new ViewMsg_Move_ACK(routing_id())); | 1003 Send(new ViewMsg_Move_ACK(routing_id())); |
960 } | 1004 } |
961 | 1005 |
962 void RenderViewHost::OnMsgDidStartLoading() { | 1006 void RenderViewHost::OnMsgDidStartLoading() { |
963 delegate_->DidStartLoading(); | 1007 delegate_->DidStartLoading(); |
964 } | 1008 } |
965 | 1009 |
966 void RenderViewHost::OnMsgDidStopLoading() { | 1010 void RenderViewHost::OnMsgDidStopLoading() { |
967 delegate_->DidStopLoading(); | 1011 delegate_->DidStopLoading(); |
968 } | 1012 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1070 void RenderViewHost::OnMsgRunJavaScriptMessage( | 1114 void RenderViewHost::OnMsgRunJavaScriptMessage( |
1071 const std::wstring& message, | 1115 const std::wstring& message, |
1072 const std::wstring& default_prompt, | 1116 const std::wstring& default_prompt, |
1073 const GURL& frame_url, | 1117 const GURL& frame_url, |
1074 const int flags, | 1118 const int flags, |
1075 IPC::Message* reply_msg) { | 1119 IPC::Message* reply_msg) { |
1076 // While a JS message dialog is showing, tabs in the same process shouldn't | 1120 // While a JS message dialog is showing, tabs in the same process shouldn't |
1077 // process input events. | 1121 // process input events. |
1078 process()->set_ignore_input_events(true); | 1122 process()->set_ignore_input_events(true); |
1079 StopHangMonitorTimeout(); | 1123 StopHangMonitorTimeout(); |
1080 delegate_->RunJavaScriptMessage(message, default_prompt, frame_url, flags, | 1124 delegate_->RunJavaScriptMessage(this, message, default_prompt, frame_url, |
1081 reply_msg, | 1125 flags, reply_msg, |
1082 &are_javascript_messages_suppressed_); | 1126 &are_javascript_messages_suppressed_); |
1083 } | 1127 } |
1084 | 1128 |
1085 void RenderViewHost::OnMsgRunBeforeUnloadConfirm(const GURL& frame_url, | 1129 void RenderViewHost::OnMsgRunBeforeUnloadConfirm(const GURL& frame_url, |
1086 const std::wstring& message, | 1130 const std::wstring& message, |
1087 IPC::Message* reply_msg) { | 1131 IPC::Message* reply_msg) { |
1088 // While a JS before unload dialog is showing, tabs in the same process | 1132 // While a JS before unload dialog is showing, tabs in the same process |
1089 // shouldn't process input events. | 1133 // shouldn't process input events. |
1090 process()->set_ignore_input_events(true); | 1134 process()->set_ignore_input_events(true); |
1091 StopHangMonitorTimeout(); | 1135 StopHangMonitorTimeout(); |
1092 delegate_->RunBeforeUnloadConfirm(message, reply_msg); | 1136 delegate_->RunBeforeUnloadConfirm(this, message, reply_msg); |
1093 } | 1137 } |
1094 | 1138 |
1095 void RenderViewHost::MediaPlayerActionAt(const gfx::Point& location, | 1139 void RenderViewHost::MediaPlayerActionAt(const gfx::Point& location, |
1096 const WebMediaPlayerAction& action) { | 1140 const WebMediaPlayerAction& action) { |
1097 // TODO(ajwong): Which thread should run this? Does it matter? | 1141 // TODO(ajwong): Which thread should run this? Does it matter? |
1098 Send(new ViewMsg_MediaPlayerActionAt(routing_id(), location, action)); | 1142 Send(new ViewMsg_MediaPlayerActionAt(routing_id(), location, action)); |
1099 } | 1143 } |
1100 | 1144 |
1101 void RenderViewHost::ContextMenuClosed( | 1145 void RenderViewHost::ContextMenuClosed( |
1102 const webkit_glue::CustomContextMenuContext& custom_context) { | 1146 const webkit_glue::CustomContextMenuContext& custom_context) { |
1103 Send(new ViewMsg_ContextMenuClosed(routing_id(), custom_context)); | 1147 Send(new ViewMsg_ContextMenuClosed(routing_id(), custom_context)); |
1104 } | 1148 } |
1105 | 1149 |
1106 void RenderViewHost::OnMsgStartDragging( | 1150 void RenderViewHost::OnMsgStartDragging( |
1107 const WebDropData& drop_data, | 1151 const WebDropData& drop_data, |
1108 WebDragOperationsMask drag_operations_mask, | 1152 WebDragOperationsMask drag_operations_mask, |
1109 const SkBitmap& image, | 1153 const SkBitmap& image, |
1110 const gfx::Point& image_offset) { | 1154 const gfx::Point& image_offset) { |
1111 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 1155 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
1112 if (view) | 1156 if (view) |
1113 view->StartDragging(drop_data, drag_operations_mask, image, image_offset); | 1157 view->StartDragging(drop_data, drag_operations_mask, image, image_offset); |
1114 } | 1158 } |
1115 | 1159 |
1116 void RenderViewHost::OnUpdateDragCursor(WebDragOperation current_op) { | 1160 void RenderViewHost::OnUpdateDragCursor(WebDragOperation current_op) { |
1117 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 1161 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
1118 if (view) | 1162 if (view) |
1119 view->UpdateDragCursor(current_op); | 1163 view->UpdateDragCursor(current_op); |
1120 } | 1164 } |
1121 | 1165 |
1122 void RenderViewHost::OnTakeFocus(bool reverse) { | 1166 void RenderViewHost::OnTakeFocus(bool reverse) { |
1123 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 1167 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1160 | 1204 |
1161 void RenderViewHost::OnUserGesture() { | 1205 void RenderViewHost::OnUserGesture() { |
1162 delegate_->OnUserGesture(); | 1206 delegate_->OnUserGesture(); |
1163 } | 1207 } |
1164 | 1208 |
1165 void RenderViewHost::OnMsgShouldCloseACK(bool proceed) { | 1209 void RenderViewHost::OnMsgShouldCloseACK(bool proceed) { |
1166 StopHangMonitorTimeout(); | 1210 StopHangMonitorTimeout(); |
1167 // If this renderer navigated while the beforeunload request was in flight, we | 1211 // 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 | 1212 // may have cleared this state in OnMsgNavigate, in which case we can ignore |
1169 // this message. | 1213 // this message. |
1170 if (!is_waiting_for_beforeunload_ack_) | 1214 if (!is_waiting_for_beforeunload_ack_ || is_swapped_out_) |
1171 return; | 1215 return; |
1172 | 1216 |
1173 is_waiting_for_beforeunload_ack_ = false; | 1217 is_waiting_for_beforeunload_ack_ = false; |
1174 | 1218 |
1175 RenderViewHostDelegate::RendererManagement* management_delegate = | 1219 RenderViewHostDelegate::RendererManagement* management_delegate = |
1176 delegate_->GetRendererManagementDelegate(); | 1220 delegate_->GetRendererManagementDelegate(); |
1177 if (management_delegate) { | 1221 if (management_delegate) { |
1178 management_delegate->ShouldClosePage( | 1222 management_delegate->ShouldClosePage( |
1179 unload_ack_is_for_cross_site_transition_, proceed); | 1223 unload_ack_is_for_cross_site_transition_, proceed); |
1180 } | 1224 } |
1181 | 1225 |
1182 // If canceled, notify the delegate to cancel its pending navigation entry. | 1226 // If canceled, notify the delegate to cancel its pending navigation entry. |
1183 if (!proceed) | 1227 if (!proceed) |
1184 delegate_->DidCancelLoading(); | 1228 delegate_->DidCancelLoading(); |
1185 } | 1229 } |
1186 | 1230 |
| 1231 void RenderViewHost::OnMsgClosePageACK() { |
| 1232 ClosePageIgnoringUnloadEvents(); |
| 1233 } |
| 1234 |
1187 void RenderViewHost::WindowMoveOrResizeStarted() { | 1235 void RenderViewHost::WindowMoveOrResizeStarted() { |
1188 Send(new ViewMsg_MoveOrResizeStarted(routing_id())); | 1236 Send(new ViewMsg_MoveOrResizeStarted(routing_id())); |
1189 } | 1237 } |
1190 | 1238 |
1191 void RenderViewHost::NotifyRendererUnresponsive() { | 1239 void RenderViewHost::NotifyRendererUnresponsive() { |
1192 delegate_->RendererUnresponsive( | 1240 delegate_->RendererUnresponsive( |
1193 this, is_waiting_for_beforeunload_ack_ || is_waiting_for_unload_ack_); | 1241 this, is_waiting_for_beforeunload_ack_ || is_waiting_for_unload_ack_); |
1194 } | 1242 } |
1195 | 1243 |
1196 void RenderViewHost::NotifyRendererResponsive() { | 1244 void RenderViewHost::NotifyRendererResponsive() { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1319 // If this renderer is not permitted to request this URL, we invalidate the | 1367 // 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 | 1368 // URL. This prevents us from storing the blocked URL and becoming confused |
1321 // later. | 1369 // later. |
1322 VLOG(1) << "Blocked URL " << url->spec(); | 1370 VLOG(1) << "Blocked URL " << url->spec(); |
1323 *url = GURL(); | 1371 *url = GURL(); |
1324 } | 1372 } |
1325 } | 1373 } |
1326 | 1374 |
1327 void RenderViewHost::OnAccessibilityNotifications( | 1375 void RenderViewHost::OnAccessibilityNotifications( |
1328 const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) { | 1376 const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) { |
1329 if (view()) | 1377 if (view() && !is_swapped_out_) |
1330 view()->OnAccessibilityNotifications(params); | 1378 view()->OnAccessibilityNotifications(params); |
1331 | 1379 |
1332 if (!params.empty()) { | 1380 if (!params.empty()) { |
1333 for (unsigned i = 0; i < params.size(); i++) { | 1381 for (unsigned i = 0; i < params.size(); i++) { |
1334 const ViewHostMsg_AccessibilityNotification_Params& param = params[i]; | 1382 const ViewHostMsg_AccessibilityNotification_Params& param = params[i]; |
1335 | 1383 |
1336 if (param.notification_type == | 1384 if (param.notification_type == |
1337 ViewHostMsg_AccessibilityNotification_Type:: | 1385 ViewHostMsg_AccessibilityNotification_Type:: |
1338 NOTIFICATION_TYPE_LOAD_COMPLETE) { | 1386 NOTIFICATION_TYPE_LOAD_COMPLETE) { |
1339 // TODO(ctguil): Remove when mac processes OnAccessibilityNotifications. | 1387 // TODO(ctguil): Remove when mac processes OnAccessibilityNotifications. |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1402 if (view) { | 1450 if (view) { |
1403 view->ShowPopupMenu(params.bounds, | 1451 view->ShowPopupMenu(params.bounds, |
1404 params.item_height, | 1452 params.item_height, |
1405 params.item_font_size, | 1453 params.item_font_size, |
1406 params.selected_item, | 1454 params.selected_item, |
1407 params.popup_items, | 1455 params.popup_items, |
1408 params.right_aligned); | 1456 params.right_aligned); |
1409 } | 1457 } |
1410 } | 1458 } |
1411 #endif | 1459 #endif |
OLD | NEW |