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

Side by Side Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 1799163002: Remove swapped out state from RenderFrameHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/render_frame_host_impl.h" 5 #include "content/browser/frame_host/render_frame_host_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 : render_view_host_(render_view_host), 188 : render_view_host_(render_view_host),
189 delegate_(delegate), 189 delegate_(delegate),
190 site_instance_(static_cast<SiteInstanceImpl*>(site_instance)), 190 site_instance_(static_cast<SiteInstanceImpl*>(site_instance)),
191 process_(site_instance->GetProcess()), 191 process_(site_instance->GetProcess()),
192 cross_process_frame_connector_(NULL), 192 cross_process_frame_connector_(NULL),
193 render_frame_proxy_host_(NULL), 193 render_frame_proxy_host_(NULL),
194 frame_tree_(frame_tree), 194 frame_tree_(frame_tree),
195 frame_tree_node_(frame_tree_node), 195 frame_tree_node_(frame_tree_node),
196 render_widget_host_(nullptr), 196 render_widget_host_(nullptr),
197 routing_id_(routing_id), 197 routing_id_(routing_id),
198 rfh_state_(STATE_DEFAULT),
198 render_frame_created_(false), 199 render_frame_created_(false),
199 navigations_suspended_(false), 200 navigations_suspended_(false),
200 is_waiting_for_beforeunload_ack_(false), 201 is_waiting_for_beforeunload_ack_(false),
201 unload_ack_is_for_navigation_(false), 202 unload_ack_is_for_navigation_(false),
202 is_loading_(false), 203 is_loading_(false),
203 pending_commit_(false), 204 pending_commit_(false),
204 nav_entry_id_(0), 205 nav_entry_id_(0),
205 accessibility_reset_token_(0), 206 accessibility_reset_token_(0),
206 accessibility_reset_count_(0), 207 accessibility_reset_count_(0),
207 no_create_browser_accessibility_manager_for_testing_(false), 208 no_create_browser_accessibility_manager_for_testing_(false),
208 web_ui_type_(WebUI::kNoWebUI), 209 web_ui_type_(WebUI::kNoWebUI),
209 pending_web_ui_type_(WebUI::kNoWebUI), 210 pending_web_ui_type_(WebUI::kNoWebUI),
210 should_reuse_web_ui_(false), 211 should_reuse_web_ui_(false),
211 weak_ptr_factory_(this) { 212 weak_ptr_factory_(this) {
212 bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
213 bool hidden = !!(flags & CREATE_RF_HIDDEN); 213 bool hidden = !!(flags & CREATE_RF_HIDDEN);
214 frame_tree_->AddRenderViewHostRef(render_view_host_); 214 frame_tree_->AddRenderViewHostRef(render_view_host_);
215 GetProcess()->AddRoute(routing_id_, this); 215 GetProcess()->AddRoute(routing_id_, this);
216 g_routing_id_frame_map.Get().insert(std::make_pair( 216 g_routing_id_frame_map.Get().insert(std::make_pair(
217 RenderFrameHostID(GetProcess()->GetID(), routing_id_), 217 RenderFrameHostID(GetProcess()->GetID(), routing_id_),
218 this)); 218 this));
219 site_instance_->AddObserver(this); 219 site_instance_->AddObserver(this);
220 220 GetSiteInstance()->IncrementActiveFrameCount();
221 if (is_swapped_out) {
222 rfh_state_ = STATE_SWAPPED_OUT;
223 } else {
224 rfh_state_ = STATE_DEFAULT;
225 GetSiteInstance()->IncrementActiveFrameCount();
226 }
227 221
228 // New child frames should inherit the nav_entry_id of their parent. 222 // New child frames should inherit the nav_entry_id of their parent.
229 if (frame_tree_node_->parent()) { 223 if (frame_tree_node_->parent()) {
230 set_nav_entry_id( 224 set_nav_entry_id(
231 frame_tree_node_->parent()->current_frame_host()->nav_entry_id()); 225 frame_tree_node_->parent()->current_frame_host()->nav_entry_id());
232 } 226 }
233 227
234 SetUpMojoIfNeeded(); 228 SetUpMojoIfNeeded();
235 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( 229 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind(
236 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); 230 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr())));
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 } 459 }
466 460
467 return GetProcess()->Send(message); 461 return GetProcess()->Send(message);
468 } 462 }
469 463
470 bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { 464 bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) {
471 // Only process messages if the RenderFrame is alive. 465 // Only process messages if the RenderFrame is alive.
472 if (!render_frame_created_) 466 if (!render_frame_created_)
473 return false; 467 return false;
474 468
475 // Filter out most IPC messages if this frame is swapped out.
Charlie Reis 2016/03/14 20:12:57 I am so excited about removing this. :)
nasko 2016/03/14 21:32:30 Same here :).
476 // We still want to handle certain ACKs to keep our state consistent.
477 if (is_swapped_out()) {
478 if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) {
479 // If this is a synchronous message and we decided not to handle it,
480 // we must send an error reply, or else the renderer will be stuck
481 // and won't respond to future requests.
482 if (msg.is_sync()) {
483 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
484 reply->set_reply_error();
485 Send(reply);
486 }
487 // Don't continue looking for someone to handle it.
488 return true;
489 }
490 }
491
492 // This message map is for handling internal IPC messages which should not 469 // This message map is for handling internal IPC messages which should not
493 // be dispatched to other objects. 470 // be dispatched to other objects.
494 bool handled = true; 471 bool handled = true;
495 IPC_BEGIN_MESSAGE_MAP(RenderFrameHostImpl, msg) 472 IPC_BEGIN_MESSAGE_MAP(RenderFrameHostImpl, msg)
496 // This message is synthetic and doesn't come from RenderFrame, but from 473 // This message is synthetic and doesn't come from RenderFrame, but from
497 // RenderProcessHost. 474 // RenderProcessHost.
498 IPC_MESSAGE_HANDLER(FrameHostMsg_RenderProcessGone, OnRenderProcessGone) 475 IPC_MESSAGE_HANDLER(FrameHostMsg_RenderProcessGone, OnRenderProcessGone)
499 IPC_MESSAGE_UNHANDLED(handled = false) 476 IPC_MESSAGE_UNHANDLED(handled = false)
500 IPC_END_MESSAGE_MAP() 477 IPC_END_MESSAGE_MAP()
501 478
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 if (frame_tree_node_->IsMainFrame()) { 1291 if (frame_tree_node_->IsMainFrame()) {
1315 // Keep the termination status so we can get at it later when we 1292 // Keep the termination status so we can get at it later when we
1316 // need to know why it died. 1293 // need to know why it died.
1317 render_view_host_->render_view_termination_status_ = 1294 render_view_host_->render_view_termination_status_ =
1318 static_cast<base::TerminationStatus>(status); 1295 static_cast<base::TerminationStatus>(status);
1319 } 1296 }
1320 1297
1321 // Reset frame tree state associated with this process. This must happen 1298 // Reset frame tree state associated with this process. This must happen
1322 // before RenderViewTerminated because observers expect the subframes of any 1299 // before RenderViewTerminated because observers expect the subframes of any
1323 // affected frames to be cleared first. 1300 // affected frames to be cleared first.
1324 // Note: When a RenderFrameHost is swapped out there is a different one 1301 frame_tree_node_->ResetForNewProcess();
1325 // which is the current host. In this case, the FrameTreeNode state must
1326 // not be reset.
1327 if (!is_swapped_out())
1328 frame_tree_node_->ResetForNewProcess();
1329 1302
1330 // Reset state for the current RenderFrameHost once the FrameTreeNode has been 1303 // Reset state for the current RenderFrameHost once the FrameTreeNode has been
1331 // reset. 1304 // reset.
1332 SetRenderFrameCreated(false); 1305 SetRenderFrameCreated(false);
1333 InvalidateMojoConnection(); 1306 InvalidateMojoConnection();
1334 1307
1335 // Execute any pending AX tree snapshot callbacks with an empty response, 1308 // Execute any pending AX tree snapshot callbacks with an empty response,
1336 // since we're never going to get a response from this renderer. 1309 // since we're never going to get a response from this renderer.
1337 for (const auto& iter : ax_tree_snapshot_callbacks_) 1310 for (const auto& iter : ax_tree_snapshot_callbacks_)
1338 iter.second.Run(ui::AXTreeUpdate()); 1311 iter.second.Run(ui::AXTreeUpdate());
(...skipping 21 matching lines...) Expand all
1360 frame_tree_node_->render_manager()->IsPendingDeletion(this)) { 1333 frame_tree_node_->render_manager()->IsPendingDeletion(this)) {
1361 render_view_host_->set_is_active(false); 1334 render_view_host_->set_is_active(false);
1362 render_view_host_->set_is_swapped_out(true); 1335 render_view_host_->set_is_swapped_out(true);
1363 } 1336 }
1364 1337
1365 if (frame_tree_node_->render_manager()->DeleteFromPendingList(this)) { 1338 if (frame_tree_node_->render_manager()->DeleteFromPendingList(this)) {
1366 // We are now deleted. 1339 // We are now deleted.
1367 return; 1340 return;
1368 } 1341 }
1369 1342
1370 // If this RFH wasn't pending deletion, then it is now swapped out. 1343 CHECK(false);
Charlie Reis 2016/03/14 20:12:57 Might be clearer if we CHECK the return value of D
nasko 2016/03/14 21:32:30 Good idea. Done, but keeping a variable around to
1371 SetState(RenderFrameHostImpl::STATE_SWAPPED_OUT);
1372 } 1344 }
1373 1345
1374 void RenderFrameHostImpl::OnContextMenu(const ContextMenuParams& params) { 1346 void RenderFrameHostImpl::OnContextMenu(const ContextMenuParams& params) {
1375 // Validate the URLs in |params|. If the renderer can't request the URLs 1347 // Validate the URLs in |params|. If the renderer can't request the URLs
1376 // directly, don't show them in the context menu. 1348 // directly, don't show them in the context menu.
1377 ContextMenuParams validated_params(params); 1349 ContextMenuParams validated_params(params);
1378 RenderProcessHost* process = GetProcess(); 1350 RenderProcessHost* process = GetProcess();
1379 1351
1380 // We don't validate |unfiltered_link_url| so that this field can be used 1352 // We don't validate |unfiltered_link_url| so that this field can be used
1381 // when users want to copy the original link URL. 1353 // when users want to copy the original link URL.
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
1886 GetServiceRegistry()->AddService<VRService>( 1858 GetServiceRegistry()->AddService<VRService>(
1887 base::Bind(&VRDeviceManager::BindRequest)); 1859 base::Bind(&VRDeviceManager::BindRequest));
1888 } 1860 }
1889 #endif 1861 #endif
1890 1862
1891 GetContentClient()->browser()->RegisterRenderFrameMojoServices( 1863 GetContentClient()->browser()->RegisterRenderFrameMojoServices(
1892 GetServiceRegistry(), this); 1864 GetServiceRegistry(), this);
1893 } 1865 }
1894 1866
1895 void RenderFrameHostImpl::SetState(RenderFrameHostImplState rfh_state) { 1867 void RenderFrameHostImpl::SetState(RenderFrameHostImplState rfh_state) {
1896 // Only main frames should be swapped out and retained inside a proxy host. 1868 // We update the number of RenderFrameHosts in a SiteInstance when the status
1897 if (rfh_state == STATE_SWAPPED_OUT) 1869 // of a RenderFrameHost gets flipped to/from active.
Charlie Reis 2016/03/14 20:12:57 Is it even possible for the state to go from inact
nasko 2016/03/14 21:32:30 Done.
1898 CHECK(!GetParent());
1899
1900 // We update the number of RenderFrameHosts in a SiteInstance when the swapped
1901 // out status of a RenderFrameHost gets flipped to/from active.
1902 if (!IsRFHStateActive(rfh_state_) && IsRFHStateActive(rfh_state)) 1870 if (!IsRFHStateActive(rfh_state_) && IsRFHStateActive(rfh_state))
1903 GetSiteInstance()->IncrementActiveFrameCount(); 1871 GetSiteInstance()->IncrementActiveFrameCount();
1904 else if (IsRFHStateActive(rfh_state_) && !IsRFHStateActive(rfh_state)) 1872 else if (IsRFHStateActive(rfh_state_) && !IsRFHStateActive(rfh_state))
1905 GetSiteInstance()->DecrementActiveFrameCount(); 1873 GetSiteInstance()->DecrementActiveFrameCount();
1906 1874
1907 // The active and swapped out state of the RVH is determined by its main 1875 // The active state of the RVH is determined by its main frame, since
1908 // frame, since subframes should have their own widgets. 1876 // subframes should have their own widgets.
1909 if (frame_tree_node_->IsMainFrame()) { 1877 if (frame_tree_node_->IsMainFrame())
1910 render_view_host_->set_is_active(IsRFHStateActive(rfh_state)); 1878 render_view_host_->set_is_active(IsRFHStateActive(rfh_state));
1911 render_view_host_->set_is_swapped_out(rfh_state == STATE_SWAPPED_OUT);
1912 }
1913 1879
1914 // Whenever we change the RFH state to and from active or swapped out state, 1880 // Whenever we change the RFH state to and from active state, we should not be
1915 // we should not be waiting for beforeunload or close acks. We clear them 1881 // waiting for beforeunload or close acks. We clear them here to be safe,
1916 // here to be safe, since they can cause navigations to be ignored in 1882 // since they can cause navigations to be ignored in
1917 // OnDidCommitProvisionalLoad. 1883 // OnDidCommitProvisionalLoad.
1918 // TODO(creis): Move is_waiting_for_beforeunload_ack_ into the state machine. 1884 // TODO(creis): Move is_waiting_for_beforeunload_ack_ into the state machine.
1919 if (rfh_state == STATE_DEFAULT || 1885 if (rfh_state == STATE_DEFAULT || rfh_state_ == STATE_DEFAULT) {
1920 rfh_state == STATE_SWAPPED_OUT ||
1921 rfh_state_ == STATE_DEFAULT ||
1922 rfh_state_ == STATE_SWAPPED_OUT) {
1923 if (is_waiting_for_beforeunload_ack_) { 1886 if (is_waiting_for_beforeunload_ack_) {
1924 is_waiting_for_beforeunload_ack_ = false; 1887 is_waiting_for_beforeunload_ack_ = false;
1925 render_view_host_->GetWidget()->decrement_in_flight_event_count(); 1888 render_view_host_->GetWidget()->decrement_in_flight_event_count();
1926 render_view_host_->GetWidget()->StopHangMonitorTimeout(); 1889 render_view_host_->GetWidget()->StopHangMonitorTimeout();
1927 } 1890 }
1928 send_before_unload_start_time_ = base::TimeTicks(); 1891 send_before_unload_start_time_ = base::TimeTicks();
1929 render_view_host_->is_waiting_for_close_ack_ = false; 1892 render_view_host_->is_waiting_for_close_ack_ = false;
1930 } 1893 }
1931 rfh_state_ = rfh_state; 1894 rfh_state_ = rfh_state;
1932 } 1895 }
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after
2712 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); 2675 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame();
2713 if (!focused_frame_tree_node) 2676 if (!focused_frame_tree_node)
2714 return; 2677 return;
2715 RenderFrameHostImpl* focused_frame = 2678 RenderFrameHostImpl* focused_frame =
2716 focused_frame_tree_node->current_frame_host(); 2679 focused_frame_tree_node->current_frame_host();
2717 DCHECK(focused_frame); 2680 DCHECK(focused_frame);
2718 dst->focused_tree_id = focused_frame->GetAXTreeID(); 2681 dst->focused_tree_id = focused_frame->GetAXTreeID();
2719 } 2682 }
2720 2683
2721 } // namespace content 2684 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698