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

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

Issue 1151393003: Add ref-count on RenderViewHost for each new RenderFrameProxyHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes based on Nick's review. Created 5 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
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/frame_tree.h" 5 #include "content/browser/frame_host/frame_tree.h"
6 6
7 #include <queue> 7 #include <queue>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 } 297 }
298 298
299 RenderViewHostImpl* FrameTree::GetRenderViewHost(SiteInstance* site_instance) { 299 RenderViewHostImpl* FrameTree::GetRenderViewHost(SiteInstance* site_instance) {
300 RenderViewHostMap::iterator iter = 300 RenderViewHostMap::iterator iter =
301 render_view_host_map_.find(site_instance->GetId()); 301 render_view_host_map_.find(site_instance->GetId());
302 if (iter == render_view_host_map_.end()) 302 if (iter == render_view_host_map_.end())
303 return nullptr; 303 return nullptr;
304 return iter->second; 304 return iter->second;
305 } 305 }
306 306
307 void FrameTree::RegisterRenderFrameHost( 307 void FrameTree::AddRenderViewHostRef(RenderViewHostImpl* render_view_host) {
308 RenderFrameHostImpl* render_frame_host) { 308 SiteInstance* site_instance = render_view_host->GetSiteInstance();
309 SiteInstance* site_instance = render_frame_host->GetSiteInstance();
310 RenderViewHostMap::iterator iter = 309 RenderViewHostMap::iterator iter =
311 render_view_host_map_.find(site_instance->GetId()); 310 render_view_host_map_.find(site_instance->GetId());
312 CHECK(iter != render_view_host_map_.end()); 311 CHECK(iter != render_view_host_map_.end());
312 CHECK(iter->second == render_view_host);
313 313
314 iter->second->increment_ref_count(); 314 iter->second->increment_ref_count();
315 } 315 }
316 316
317 void FrameTree::UnregisterRenderFrameHost( 317 void FrameTree::ReleaseRenderViewHostRef(RenderViewHostImpl* render_view_host) {
318 RenderFrameHostImpl* render_frame_host) { 318 SiteInstance* site_instance = render_view_host->GetSiteInstance();
319 SiteInstance* site_instance = render_frame_host->GetSiteInstance();
320 int32 site_instance_id = site_instance->GetId(); 319 int32 site_instance_id = site_instance->GetId();
321 RenderViewHostMap::iterator iter = 320 RenderViewHostMap::iterator iter =
322 render_view_host_map_.find(site_instance_id); 321 render_view_host_map_.find(site_instance_id);
323 if (iter != render_view_host_map_.end() && 322 if (iter != render_view_host_map_.end() && iter->second == render_view_host) {
324 iter->second == render_frame_host->render_view_host()) {
325 // Decrement the refcount and shutdown the RenderViewHost if no one else is 323 // Decrement the refcount and shutdown the RenderViewHost if no one else is
326 // using it. 324 // using it.
327 CHECK_GT(iter->second->ref_count(), 0); 325 CHECK_GT(iter->second->ref_count(), 0);
328 iter->second->decrement_ref_count(); 326 iter->second->decrement_ref_count();
329 if (iter->second->ref_count() == 0) { 327 if (iter->second->ref_count() == 0) {
330 iter->second->Shutdown(); 328 iter->second->Shutdown();
331 render_view_host_map_.erase(iter); 329 render_view_host_map_.erase(iter);
332 } 330 }
333 } else { 331 } else {
334 // The RenderViewHost should be in the list of RenderViewHosts pending 332 // The RenderViewHost should be in the list of RenderViewHosts pending
335 // shutdown. 333 // shutdown.
336 bool render_view_host_found = false; 334 bool render_view_host_found = false;
337 std::pair<RenderViewHostMultiMap::iterator, 335 std::pair<RenderViewHostMultiMap::iterator,
338 RenderViewHostMultiMap::iterator> result = 336 RenderViewHostMultiMap::iterator> result =
339 render_view_host_pending_shutdown_map_.equal_range(site_instance_id); 337 render_view_host_pending_shutdown_map_.equal_range(site_instance_id);
340 for (RenderViewHostMultiMap::iterator multi_iter = result.first; 338 for (RenderViewHostMultiMap::iterator multi_iter = result.first;
341 multi_iter != result.second; 339 multi_iter != result.second;
342 ++multi_iter) { 340 ++multi_iter) {
343 if (multi_iter->second != render_frame_host->render_view_host()) 341 if (multi_iter->second != render_view_host)
344 continue; 342 continue;
345 render_view_host_found = true; 343 render_view_host_found = true;
346 RenderViewHostImpl* rvh = multi_iter->second;
347 // Decrement the refcount and shutdown the RenderViewHost if no one else 344 // Decrement the refcount and shutdown the RenderViewHost if no one else
348 // is using it. 345 // is using it.
349 CHECK_GT(rvh->ref_count(), 0); 346 CHECK_GT(render_view_host->ref_count(), 0);
350 rvh->decrement_ref_count(); 347 render_view_host->decrement_ref_count();
351 if (rvh->ref_count() == 0) { 348 if (render_view_host->ref_count() == 0) {
352 rvh->Shutdown(); 349 render_view_host->Shutdown();
353 render_view_host_pending_shutdown_map_.erase(multi_iter); 350 render_view_host_pending_shutdown_map_.erase(multi_iter);
354 } 351 }
355 break; 352 break;
356 } 353 }
357 CHECK(render_view_host_found); 354 CHECK(render_view_host_found);
358 } 355 }
359 } 356 }
360 357
361 void FrameTree::FrameRemoved(FrameTreeNode* frame) { 358 void FrameTree::FrameRemoved(FrameTreeNode* frame) {
362 if (frame->frame_tree_node_id() == focused_frame_tree_node_id_) 359 if (frame->frame_tree_node_id() == focused_frame_tree_node_id_)
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 load_progress_ = 0.0; 391 load_progress_ = 0.0;
395 } 392 }
396 393
397 bool FrameTree::IsLoading() { 394 bool FrameTree::IsLoading() {
398 bool is_loading = false; 395 bool is_loading = false;
399 ForEach(base::Bind(&IsNodeLoading, &is_loading)); 396 ForEach(base::Bind(&IsNodeLoading, &is_loading));
400 return is_loading; 397 return is_loading;
401 } 398 }
402 399
403 } // namespace content 400 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/frame_tree.h ('k') | content/browser/frame_host/render_frame_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698