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

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

Issue 213413005: Ensure RenderViewHost is not shut down until a screenshot of the page is taken. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing some unit tests. Created 6 years, 8 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 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 has_accessed_initial_document_(false), 206 has_accessed_initial_document_(false),
207 main_frame_routing_id_(main_frame_routing_id), 207 main_frame_routing_id_(main_frame_routing_id),
208 run_modal_reply_msg_(NULL), 208 run_modal_reply_msg_(NULL),
209 run_modal_opener_id_(MSG_ROUTING_NONE), 209 run_modal_opener_id_(MSG_ROUTING_NONE),
210 is_waiting_for_beforeunload_ack_(false), 210 is_waiting_for_beforeunload_ack_(false),
211 unload_ack_is_for_cross_site_transition_(false), 211 unload_ack_is_for_cross_site_transition_(false),
212 are_javascript_messages_suppressed_(false), 212 are_javascript_messages_suppressed_(false),
213 sudden_termination_allowed_(false), 213 sudden_termination_allowed_(false),
214 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING), 214 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING),
215 virtual_keyboard_requested_(false), 215 virtual_keyboard_requested_(false),
216 copy_requests_(0),
216 weak_factory_(this) { 217 weak_factory_(this) {
217 DCHECK(instance_.get()); 218 DCHECK(instance_.get());
218 CHECK(delegate_); // http://crbug.com/82827 219 CHECK(delegate_); // http://crbug.com/82827
219 220
220 GetProcess()->EnableSendQueue(); 221 GetProcess()->EnableSendQueue();
221 222
222 if (swapped_out) { 223 if (swapped_out) {
223 rvh_state_ = STATE_SWAPPED_OUT; 224 rvh_state_ = STATE_SWAPPED_OUT;
224 } else { 225 } else {
225 rvh_state_ = STATE_DEFAULT; 226 rvh_state_ = STATE_DEFAULT;
(...skipping 23 matching lines...) Expand all
249 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted, 250 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted,
250 base::Unretained(ResourceDispatcherHostImpl::Get()), 251 base::Unretained(ResourceDispatcherHostImpl::Get()),
251 GetProcess()->GetID(), GetRoutingID())); 252 GetProcess()->GetID(), GetRoutingID()));
252 } 253 }
253 254
254 delegate_->RenderViewDeleted(this); 255 delegate_->RenderViewDeleted(this);
255 256
256 // Be sure to clean up any leftover state from cross-site requests. 257 // Be sure to clean up any leftover state from cross-site requests.
257 CrossSiteRequestManager::GetInstance()->SetHasPendingCrossSiteRequest( 258 CrossSiteRequestManager::GetInstance()->SetHasPendingCrossSiteRequest(
258 GetProcess()->GetID(), GetRoutingID(), false); 259 GetProcess()->GetID(), GetRoutingID(), false);
259 260
nasko 2014/03/26 22:48:27 Since we don't want to delete this object before a
mfomitchev 2014/03/27 21:51:34 Done.
260 // If this was swapped out, it already decremented the active view 261 // If this was swapped out, it already decremented the active view
261 // count of the SiteInstance it belongs to. 262 // count of the SiteInstance it belongs to.
262 if (IsRVHStateActive(rvh_state_)) 263 if (IsRVHStateActive(rvh_state_))
263 instance_->decrement_active_view_count(); 264 instance_->decrement_active_view_count();
264 } 265 }
265 266
266 RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const { 267 RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const {
267 return delegate_; 268 return delegate_;
268 } 269 }
269 270
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 638
638 switch (rvh_state_) { 639 switch (rvh_state_) {
639 case STATE_WAITING_FOR_UNLOAD_ACK: 640 case STATE_WAITING_FOR_UNLOAD_ACK:
640 SetState(STATE_WAITING_FOR_COMMIT); 641 SetState(STATE_WAITING_FOR_COMMIT);
641 break; 642 break;
642 case STATE_PENDING_SWAP_OUT: 643 case STATE_PENDING_SWAP_OUT:
643 SetState(STATE_SWAPPED_OUT); 644 SetState(STATE_SWAPPED_OUT);
644 break; 645 break;
645 case STATE_PENDING_SHUTDOWN: 646 case STATE_PENDING_SHUTDOWN:
646 DCHECK(!pending_shutdown_on_swap_out_.is_null()); 647 DCHECK(!pending_shutdown_on_swap_out_.is_null());
647 pending_shutdown_on_swap_out_.Run(); 648 if (copy_requests_ == 0)
649 pending_shutdown_on_swap_out_.Run();
648 break; 650 break;
649 default: 651 default:
650 NOTREACHED(); 652 NOTREACHED();
651 } 653 }
652 } 654 }
653 655
654 void RenderViewHostImpl::WasSwappedOut( 656 void RenderViewHostImpl::WasSwappedOut(
655 const base::Closure& pending_delete_on_swap_out) { 657 const base::Closure& pending_delete_on_swap_out) {
656 Send(new ViewMsg_WasSwappedOut(GetRoutingID())); 658 if (copy_requests_ == 0)
nasko 2014/03/26 22:48:27 nit: A comment explaining why we aren't sending th
mfomitchev 2014/03/27 21:51:34 Done.
659 Send(new ViewMsg_WasSwappedOut(GetRoutingID()));
657 if (rvh_state_ == STATE_WAITING_FOR_UNLOAD_ACK) { 660 if (rvh_state_ == STATE_WAITING_FOR_UNLOAD_ACK) {
658 SetState(STATE_PENDING_SWAP_OUT); 661 SetState(STATE_PENDING_SWAP_OUT);
659 if (!instance_->active_view_count()) 662 if (!instance_->active_view_count() ||
663 (instance_->active_view_count() - copy_requests_) == 0) {
clamy 2014/03/27 15:59:36 I don't think this is correct. If you have 2 copy
mfomitchev 2014/03/27 21:51:34 Ok, so the reason we were doing this was that RVH
660 SetPendingShutdown(pending_delete_on_swap_out); 664 SetPendingShutdown(pending_delete_on_swap_out);
665 }
661 } else if (rvh_state_ == STATE_WAITING_FOR_COMMIT) { 666 } else if (rvh_state_ == STATE_WAITING_FOR_COMMIT) {
662 SetState(STATE_SWAPPED_OUT); 667 SetState(STATE_SWAPPED_OUT);
663 } else if (rvh_state_ == STATE_DEFAULT) { 668 } else if (rvh_state_ == STATE_DEFAULT) {
664 // When the RenderView is not live, the RenderFrameHostManager will call 669 // When the RenderView is not live, the RenderFrameHostManager will call
665 // CommitPending directly, without calling SwapOut on the old RVH. This will 670 // CommitPending directly, without calling SwapOut on the old RVH. This will
666 // cause WasSwappedOut to be called directly on the live old RVH. 671 // cause WasSwappedOut to be called directly on the live old RVH.
667 DCHECK(!IsRenderViewLive()); 672 DCHECK(!IsRenderViewLive());
668 SetState(STATE_SWAPPED_OUT); 673 SetState(STATE_SWAPPED_OUT);
669 } else { 674 } else {
670 NOTREACHED(); 675 NOTREACHED();
(...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 const GetAudioOutputControllersCallback& callback) const { 1707 const GetAudioOutputControllersCallback& callback) const {
1703 AudioRendererHost* audio_host = 1708 AudioRendererHost* audio_host =
1704 static_cast<RenderProcessHostImpl*>(GetProcess())->audio_renderer_host(); 1709 static_cast<RenderProcessHostImpl*>(GetProcess())->audio_renderer_host();
1705 audio_host->GetOutputControllers(GetRoutingID(), callback); 1710 audio_host->GetOutputControllers(GetRoutingID(), callback);
1706 } 1711 }
1707 1712
1708 void RenderViewHostImpl::ClearFocusedElement() { 1713 void RenderViewHostImpl::ClearFocusedElement() {
1709 Send(new ViewMsg_ClearFocusedElement(GetRoutingID())); 1714 Send(new ViewMsg_ClearFocusedElement(GetRoutingID()));
1710 } 1715 }
1711 1716
1717 void RenderViewHostImpl::CopyFromBackingStoreCallback(
1718 const base::Callback<void(bool, const SkBitmap&)>& callback,
1719 bool success,
1720 const SkBitmap& bitmap) {
1721 --copy_requests_;
1722 callback.Run(success, bitmap);
1723 if (copy_requests_ == 0) {
1724 if (!IsRVHStateActive(rvh_state_)) {
nasko 2014/03/26 22:48:27 Since we are only trying to delay the shutdown, th
mfomitchev 2014/03/27 21:51:34 This looks fine to me, maybe I am missing somethin
1725 Send(new ViewMsg_WasSwappedOut(GetRoutingID()));
1726 instance_->decrement_active_view_count();
nasko 2014/03/26 22:48:27 A comment explaining what we are doing here is def
mfomitchev 2014/03/27 21:51:34 Think it should be more clear now with pending_shu
1727 }
1728
1729 if (rvh_state_ == STATE_PENDING_SHUTDOWN) {
1730 DCHECK(!pending_shutdown_on_swap_out_.is_null());
1731 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
mfomitchev 2014/03/26 18:59:30 I am wondering if we can have a situation where th
clamy 2014/03/27 15:59:36 What pending_shutdown_on_swap_out_ does is remove
mfomitchev 2014/03/27 21:51:34 Added pending_shutdown_on_copy_requests_done_ to a
1732 pending_shutdown_on_swap_out_);
nasko 2014/03/26 22:48:27 I don't see why we need to delay the shutdown here
mfomitchev 2014/03/27 21:51:34 Done. Sadrul mentioned that he saw something on th
1733 }
1734 }
1735 }
1736
1737 void RenderViewHostImpl::CopyFromBackingStore(
1738 const gfx::Rect& src_rect,
1739 const gfx::Size& accelerated_dst_size,
1740 const base::Callback<void(bool, const SkBitmap&)>& callback,
1741 const SkBitmap::Config& bitmap_config) {
1742 DCHECK(IsRVHStateActive(rvh_state_));
1743 if (!IsRVHStateActive(rvh_state_)) {
1744 callback.Run(false, SkBitmap());
1745 return;
1746 }
1747 ++copy_requests_;
1748 RenderWidgetHostImpl::CopyFromBackingStore(src_rect, accelerated_dst_size,
1749 base::Bind(&RenderViewHostImpl::CopyFromBackingStoreCallback,
1750 weak_factory_.GetWeakPtr(),
1751 callback),
1752 bitmap_config);
1753 }
1754
1712 void RenderViewHostImpl::Zoom(PageZoom zoom) { 1755 void RenderViewHostImpl::Zoom(PageZoom zoom) {
1713 Send(new ViewMsg_Zoom(GetRoutingID(), zoom)); 1756 Send(new ViewMsg_Zoom(GetRoutingID(), zoom));
1714 } 1757 }
1715 1758
1716 void RenderViewHostImpl::ReloadFrame() { 1759 void RenderViewHostImpl::ReloadFrame() {
1717 Send(new ViewMsg_ReloadFrame(GetRoutingID())); 1760 Send(new ViewMsg_ReloadFrame(GetRoutingID()));
1718 } 1761 }
1719 1762
1720 void RenderViewHostImpl::DisableScrollbarsForThreshold(const gfx::Size& size) { 1763 void RenderViewHostImpl::DisableScrollbarsForThreshold(const gfx::Size& size) {
1721 Send(new ViewMsg_DisableScrollbarsForSmallWindows(GetRoutingID(), size)); 1764 Send(new ViewMsg_DisableScrollbarsForSmallWindows(GetRoutingID(), size));
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 params.allow_multiple_selection); 1938 params.allow_multiple_selection);
1896 } 1939 }
1897 } 1940 }
1898 #endif 1941 #endif
1899 1942
1900 void RenderViewHostImpl::SetState(RenderViewHostImplState rvh_state) { 1943 void RenderViewHostImpl::SetState(RenderViewHostImplState rvh_state) {
1901 // We update the number of RenderViews in a SiteInstance when the 1944 // We update the number of RenderViews in a SiteInstance when the
1902 // swapped out status of this RenderView gets flipped to/from live. 1945 // swapped out status of this RenderView gets flipped to/from live.
1903 if (!IsRVHStateActive(rvh_state_) && IsRVHStateActive(rvh_state)) 1946 if (!IsRVHStateActive(rvh_state_) && IsRVHStateActive(rvh_state))
1904 instance_->increment_active_view_count(); 1947 instance_->increment_active_view_count();
1905 else if (IsRVHStateActive(rvh_state_) && !IsRVHStateActive(rvh_state)) 1948 else if (IsRVHStateActive(rvh_state_) && !IsRVHStateActive(rvh_state) &&
1949 copy_requests_ == 0)
1906 instance_->decrement_active_view_count(); 1950 instance_->decrement_active_view_count();
1907 1951
1908 // Whenever we change the RVH state to and from live or swapped out state, we 1952 // Whenever we change the RVH state to and from live or swapped out state, we
1909 // should not be waiting for beforeunload or unload acks. We clear them here 1953 // should not be waiting for beforeunload or unload acks. We clear them here
1910 // to be safe, since they can cause navigations to be ignored in OnNavigate. 1954 // to be safe, since they can cause navigations to be ignored in OnNavigate.
1911 if (rvh_state == STATE_DEFAULT || 1955 if (rvh_state == STATE_DEFAULT ||
1912 rvh_state == STATE_SWAPPED_OUT || 1956 rvh_state == STATE_SWAPPED_OUT ||
1913 rvh_state_ == STATE_DEFAULT || 1957 rvh_state_ == STATE_DEFAULT ||
1914 rvh_state_ == STATE_SWAPPED_OUT) { 1958 rvh_state_ == STATE_SWAPPED_OUT) {
1915 is_waiting_for_beforeunload_ack_ = false; 1959 is_waiting_for_beforeunload_ack_ = false;
(...skipping 16 matching lines...) Expand all
1932 return true; 1976 return true;
1933 } 1977 }
1934 1978
1935 void RenderViewHostImpl::AttachToFrameTree() { 1979 void RenderViewHostImpl::AttachToFrameTree() {
1936 FrameTree* frame_tree = delegate_->GetFrameTree(); 1980 FrameTree* frame_tree = delegate_->GetFrameTree();
1937 1981
1938 frame_tree->ResetForMainFrameSwap(); 1982 frame_tree->ResetForMainFrameSwap();
1939 } 1983 }
1940 1984
1941 } // namespace content 1985 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698