OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |