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

Side by Side Diff: content/browser/tab_contents/render_view_host_manager.cc

Issue 9146028: Define the public interface for content browser SiteInstance. This interface is implemented by th... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 8 years, 11 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 | Annotate | Revision Log
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/tab_contents/render_view_host_manager.h" 5 #include "content/browser/tab_contents/render_view_host_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "content/browser/debugger/devtools_manager_impl.h" 11 #include "content/browser/debugger/devtools_manager_impl.h"
12 #include "content/browser/renderer_host/render_view_host.h" 12 #include "content/browser/renderer_host/render_view_host.h"
13 #include "content/browser/renderer_host/render_view_host_factory.h" 13 #include "content/browser/renderer_host/render_view_host_factory.h"
14 #include "content/browser/renderer_host/render_widget_host_view.h" 14 #include "content/browser/renderer_host/render_widget_host_view.h"
15 #include "content/browser/site_instance.h" 15 #include "content/browser/site_instance_impl.h"
16 #include "content/browser/tab_contents/navigation_controller_impl.h" 16 #include "content/browser/tab_contents/navigation_controller_impl.h"
17 #include "content/browser/tab_contents/navigation_entry_impl.h" 17 #include "content/browser/tab_contents/navigation_entry_impl.h"
18 #include "content/browser/webui/web_ui_impl.h" 18 #include "content/browser/webui/web_ui_impl.h"
19 #include "content/common/view_messages.h" 19 #include "content/common/view_messages.h"
20 #include "content/public/browser/content_browser_client.h" 20 #include "content/public/browser/content_browser_client.h"
21 #include "content/public/browser/notification_service.h" 21 #include "content/public/browser/notification_service.h"
22 #include "content/public/browser/notification_types.h" 22 #include "content/public/browser/notification_types.h"
23 #include "content/public/browser/render_view_host_delegate.h" 23 #include "content/public/browser/render_view_host_delegate.h"
24 #include "content/public/browser/web_contents_view.h" 24 #include "content/public/browser/web_contents_view.h"
25 #include "content/public/browser/web_ui_controller.h" 25 #include "content/public/browser/web_ui_controller.h"
(...skipping 27 matching lines...) Expand all
53 53
54 // Shut down any swapped out RenderViewHosts. 54 // Shut down any swapped out RenderViewHosts.
55 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); 55 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin();
56 iter != swapped_out_hosts_.end(); 56 iter != swapped_out_hosts_.end();
57 ++iter) { 57 ++iter) {
58 iter->second->Shutdown(); 58 iter->second->Shutdown();
59 } 59 }
60 } 60 }
61 61
62 void RenderViewHostManager::Init(content::BrowserContext* browser_context, 62 void RenderViewHostManager::Init(content::BrowserContext* browser_context,
63 SiteInstance* site_instance, 63 content::SiteInstance* site_instance,
64 int routing_id) { 64 int routing_id) {
65 // Create a RenderViewHost, once we have an instance. It is important to 65 // Create a RenderViewHost, once we have an instance. It is important to
66 // immediately give this SiteInstance to a RenderViewHost so that it is 66 // immediately give this SiteInstance to a RenderViewHost so that it is
67 // ref counted. 67 // ref counted.
68 if (!site_instance) 68 if (!site_instance)
69 site_instance = SiteInstance::CreateSiteInstance(browser_context); 69 site_instance = content::SiteInstance::CreateSiteInstance(
70 browser_context);
70 render_view_host_ = RenderViewHostFactory::Create( 71 render_view_host_ = RenderViewHostFactory::Create(
71 site_instance, render_view_delegate_, routing_id, delegate_-> 72 site_instance, render_view_delegate_, routing_id, delegate_->
72 GetControllerForRenderManager().GetSessionStorageNamespace()); 73 GetControllerForRenderManager().GetSessionStorageNamespace());
73 74
74 // Keep track of renderer processes as they start to shut down. 75 // Keep track of renderer processes as they start to shut down.
75 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSING, 76 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSING,
76 content::NotificationService::AllSources()); 77 content::NotificationService::AllSources());
77 } 78 }
78 79
79 RenderWidgetHostView* RenderViewHostManager::GetRenderWidgetHostView() const { 80 RenderWidgetHostView* RenderViewHostManager::GetRenderWidgetHostView() const {
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 const NavigationEntryImpl* new_entry) const { 339 const NavigationEntryImpl* new_entry) const {
339 DCHECK(new_entry); 340 DCHECK(new_entry);
340 341
341 // Check for reasons to swap processes even if we are in a process model that 342 // Check for reasons to swap processes even if we are in a process model that
342 // doesn't usually swap (e.g., process-per-tab). 343 // doesn't usually swap (e.g., process-per-tab).
343 344
344 // For security, we should transition between processes when one is a Web UI 345 // For security, we should transition between processes when one is a Web UI
345 // page and one isn't. If there's no cur_entry, check the current RVH's 346 // page and one isn't. If there's no cur_entry, check the current RVH's
346 // site, which might already be committed to a Web UI URL (such as the NTP). 347 // site, which might already be committed to a Web UI URL (such as the NTP).
347 const GURL& current_url = (cur_entry) ? cur_entry->GetURL() : 348 const GURL& current_url = (cur_entry) ? cur_entry->GetURL() :
348 render_view_host_->site_instance()->site(); 349 render_view_host_->site_instance()->GetSite();
349 content::BrowserContext* browser_context = 350 content::BrowserContext* browser_context =
350 delegate_->GetControllerForRenderManager().GetBrowserContext(); 351 delegate_->GetControllerForRenderManager().GetBrowserContext();
351 const content::WebUIFactory* web_ui_factory = 352 const content::WebUIFactory* web_ui_factory =
352 content::GetContentClient()->browser()->GetWebUIFactory(); 353 content::GetContentClient()->browser()->GetWebUIFactory();
353 if (web_ui_factory->UseWebUIForURL(browser_context, current_url)) { 354 if (web_ui_factory->UseWebUIForURL(browser_context, current_url)) {
354 // Force swap if it's not an acceptable URL for Web UI. 355 // Force swap if it's not an acceptable URL for Web UI.
355 if (!web_ui_factory->IsURLAcceptableForWebUI(browser_context, 356 if (!web_ui_factory->IsURLAcceptableForWebUI(browser_context,
356 new_entry->GetURL())) 357 new_entry->GetURL()))
357 return true; 358 return true;
358 } else { 359 } else {
(...skipping 13 matching lines...) Expand all
372 // We can't switch a RenderView between view source and non-view source mode 373 // We can't switch a RenderView between view source and non-view source mode
373 // without screwing up the session history sometimes (when navigating between 374 // without screwing up the session history sometimes (when navigating between
374 // "view-source:http://foo.com/" and "http://foo.com/", WebKit doesn't treat 375 // "view-source:http://foo.com/" and "http://foo.com/", WebKit doesn't treat
375 // it as a new navigation). So require a view switch. 376 // it as a new navigation). So require a view switch.
376 if (cur_entry->IsViewSourceMode() != new_entry->IsViewSourceMode()) 377 if (cur_entry->IsViewSourceMode() != new_entry->IsViewSourceMode())
377 return true; 378 return true;
378 379
379 return false; 380 return false;
380 } 381 }
381 382
382 SiteInstance* RenderViewHostManager::GetSiteInstanceForEntry( 383 content::SiteInstance* RenderViewHostManager::GetSiteInstanceForEntry(
383 const NavigationEntryImpl& entry, 384 const NavigationEntryImpl& entry,
384 SiteInstance* curr_instance) { 385 content::SiteInstance* curr_instance) {
385 // NOTE: This is only called when ShouldTransitionCrossSite is true. 386 // NOTE: This is only called when ShouldTransitionCrossSite is true.
386 387
387 const GURL& dest_url = entry.GetURL(); 388 const GURL& dest_url = entry.GetURL();
388 NavigationControllerImpl& controller = 389 NavigationControllerImpl& controller =
389 delegate_->GetControllerForRenderManager(); 390 delegate_->GetControllerForRenderManager();
390 content::BrowserContext* browser_context = controller.GetBrowserContext(); 391 content::BrowserContext* browser_context = controller.GetBrowserContext();
391 392
392 // If the entry has an instance already we should use it. 393 // If the entry has an instance already we should use it.
393 if (entry.site_instance()) 394 if (entry.site_instance())
394 return entry.site_instance(); 395 return entry.site_instance();
395 396
396 // (UGLY) HEURISTIC, process-per-site only: 397 // (UGLY) HEURISTIC, process-per-site only:
397 // 398 //
398 // If this navigation is generated, then it probably corresponds to a search 399 // If this navigation is generated, then it probably corresponds to a search
399 // query. Given that search results typically lead to users navigating to 400 // query. Given that search results typically lead to users navigating to
400 // other sites, we don't really want to use the search engine hostname to 401 // other sites, we don't really want to use the search engine hostname to
401 // determine the site instance for this navigation. 402 // determine the site instance for this navigation.
402 // 403 //
403 // NOTE: This can be removed once we have a way to transition between 404 // NOTE: This can be removed once we have a way to transition between
404 // RenderViews in response to a link click. 405 // RenderViews in response to a link click.
405 // 406 //
406 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerSite) && 407 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerSite) &&
407 entry.GetTransitionType() == content::PAGE_TRANSITION_GENERATED) 408 entry.GetTransitionType() == content::PAGE_TRANSITION_GENERATED)
408 return curr_instance; 409 return curr_instance;
409 410
410 // If we haven't used our SiteInstance (and thus RVH) yet, then we can use it 411 // If we haven't used our SiteInstance (and thus RVH) yet, then we can use it
411 // for this entry. We won't commit the SiteInstance to this site until the 412 // for this entry. We won't commit the SiteInstance to this site until the
412 // navigation commits (in DidNavigate), unless the navigation entry was 413 // navigation commits (in DidNavigate), unless the navigation entry was
413 // restored or it's a Web UI as described below. 414 // restored or it's a Web UI as described below.
414 if (!curr_instance->has_site()) { 415 if (!curr_instance->HasSite()) {
415 // If we've already created a SiteInstance for our destination, we don't 416 // If we've already created a SiteInstance for our destination, we don't
416 // want to use this unused SiteInstance; use the existing one. (We don't 417 // want to use this unused SiteInstance; use the existing one. (We don't
417 // do this check if the curr_instance has a site, because for now, we want 418 // do this check if the curr_instance has a site, because for now, we want
418 // to compare against the current URL and not the SiteInstance's site. In 419 // to compare against the current URL and not the SiteInstance's site. In
419 // this case, there is no current URL, so comparing against the site is ok. 420 // this case, there is no current URL, so comparing against the site is ok.
420 // See additional comments below.) 421 // See additional comments below.)
421 if (curr_instance->HasRelatedSiteInstance(dest_url)) 422 if (curr_instance->HasRelatedSiteInstance(dest_url))
422 return curr_instance->GetRelatedSiteInstance(dest_url); 423 return curr_instance->GetRelatedSiteInstance(dest_url);
423 424
424 // For extensions, Web UI URLs (such as the new tab page), and apps we do 425 // For extensions, Web UI URLs (such as the new tab page), and apps we do
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 // has a site), then we must have been opened from another tab. We want 463 // has a site), then we must have been opened from another tab. We want
463 // to compare against the URL of the page that opened us, but we can't 464 // to compare against the URL of the page that opened us, but we can't
464 // get to it directly. The best we can do is check against the site of 465 // get to it directly. The best we can do is check against the site of
465 // the SiteInstance. This will be correct when we intercept links and 466 // the SiteInstance. This will be correct when we intercept links and
466 // script-based navigations, but for now, it could place some pages in a 467 // script-based navigations, but for now, it could place some pages in a
467 // new process unnecessarily. We should only hit this case if a page tries 468 // new process unnecessarily. We should only hit this case if a page tries
468 // to open a new tab to an interstitial-inducing URL, and then navigates 469 // to open a new tab to an interstitial-inducing URL, and then navigates
469 // the page to a different same-site URL. (This seems very unlikely in 470 // the page to a different same-site URL. (This seems very unlikely in
470 // practice.) 471 // practice.)
471 const GURL& current_url = (curr_entry) ? curr_entry->GetURL() : 472 const GURL& current_url = (curr_entry) ? curr_entry->GetURL() :
472 curr_instance->site(); 473 curr_instance->GetSite();
473 474
474 // Use the current SiteInstance for same site navigations, as long as the 475 // Use the current SiteInstance for same site navigations, as long as the
475 // process type is correct. (The URL may have been installed as an app since 476 // process type is correct. (The URL may have been installed as an app since
476 // the last time we visited it.) 477 // the last time we visited it.)
477 if (SiteInstance::IsSameWebSite(browser_context, current_url, dest_url) && 478 if (content::SiteInstance::IsSameWebSite(
479 browser_context, current_url, dest_url) &&
478 !curr_instance->HasWrongProcessForURL(dest_url)) { 480 !curr_instance->HasWrongProcessForURL(dest_url)) {
479 return curr_instance; 481 return curr_instance;
480 } else if (ShouldSwapProcessesForNavigation(curr_entry, &entry)) { 482 } else if (ShouldSwapProcessesForNavigation(curr_entry, &entry)) {
481 // When we're swapping, we need to force the site instance AND browsing 483 // When we're swapping, we need to force the site instance AND browsing
482 // instance to be different ones. This addresses special cases where we use 484 // instance to be different ones. This addresses special cases where we use
483 // a single BrowsingInstance for all pages of a certain type (e.g., New Tab 485 // a single BrowsingInstance for all pages of a certain type (e.g., New Tab
484 // Pages), keeping them in the same process. When you navigate away from 486 // Pages), keeping them in the same process. When you navigate away from
485 // that page, we want to explicity ignore that BrowsingInstance and group 487 // that page, we want to explicity ignore that BrowsingInstance and group
486 // this page into the appropriate SiteInstance for its URL. 488 // this page into the appropriate SiteInstance for its URL.
487 return SiteInstance::CreateSiteInstanceForURL(browser_context, dest_url); 489 return content::SiteInstance::CreateSiteInstanceForURL(browser_context,
490 dest_url);
488 } else { 491 } else {
489 // Start the new renderer in a new SiteInstance, but in the current 492 // Start the new renderer in a new SiteInstance, but in the current
490 // BrowsingInstance. It is important to immediately give this new 493 // BrowsingInstance. It is important to immediately give this new
491 // SiteInstance to a RenderViewHost (if it is different than our current 494 // SiteInstance to a RenderViewHost (if it is different than our current
492 // SiteInstance), so that it is ref counted. This will happen in 495 // SiteInstance), so that it is ref counted. This will happen in
493 // CreatePendingRenderView. 496 // CreatePendingRenderView.
494 return curr_instance->GetRelatedSiteInstance(dest_url); 497 return curr_instance->GetRelatedSiteInstance(dest_url);
495 } 498 }
496 } 499 }
497 500
498 bool RenderViewHostManager::CreatePendingRenderView( 501 bool RenderViewHostManager::CreatePendingRenderView(
499 const NavigationEntryImpl& entry, SiteInstance* instance) { 502 const NavigationEntryImpl& entry, content::SiteInstance* instance) {
500 NavigationEntry* curr_entry = 503 NavigationEntry* curr_entry =
501 delegate_->GetControllerForRenderManager().GetLastCommittedEntry(); 504 delegate_->GetControllerForRenderManager().GetLastCommittedEntry();
502 if (curr_entry) { 505 if (curr_entry) {
503 DCHECK(!curr_entry->GetContentState().empty()); 506 DCHECK(!curr_entry->GetContentState().empty());
504 // TODO(creis): Should send a message to the RenderView to let it know 507 // TODO(creis): Should send a message to the RenderView to let it know
505 // we're about to switch away, so that it sends an UpdateState message. 508 // we're about to switch away, so that it sends an UpdateState message.
506 } 509 }
507 510
508 // Check if we've already created an RVH for this SiteInstance. 511 // Check if we've already created an RVH for this SiteInstance.
509 CHECK(instance); 512 CHECK(instance);
510 RenderViewHostMap::iterator iter = 513 RenderViewHostMap::iterator iter =
511 swapped_out_hosts_.find(instance->id()); 514 swapped_out_hosts_.find(instance->GetId());
512 if (iter != swapped_out_hosts_.end()) { 515 if (iter != swapped_out_hosts_.end()) {
513 // Re-use the existing RenderViewHost, which has already been initialized. 516 // Re-use the existing RenderViewHost, which has already been initialized.
514 // We'll remove it from the list of swapped out hosts if it commits. 517 // We'll remove it from the list of swapped out hosts if it commits.
515 pending_render_view_host_ = iter->second; 518 pending_render_view_host_ = iter->second;
516 519
517 // Prevent the process from exiting while we're trying to use it. 520 // Prevent the process from exiting while we're trying to use it.
518 pending_render_view_host_->process()->AddPendingView(); 521 pending_render_view_host_->process()->AddPendingView();
519 522
520 return true; 523 return true;
521 } 524 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 609
607 std::pair<RenderViewHost*, RenderViewHost*> details = 610 std::pair<RenderViewHost*, RenderViewHost*> details =
608 std::make_pair(old_render_view_host, render_view_host_); 611 std::make_pair(old_render_view_host, render_view_host_);
609 content::NotificationService::current()->Notify( 612 content::NotificationService::current()->Notify(
610 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED, 613 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED,
611 content::Source<NavigationController>( 614 content::Source<NavigationController>(
612 &delegate_->GetControllerForRenderManager()), 615 &delegate_->GetControllerForRenderManager()),
613 content::Details<std::pair<RenderViewHost*, RenderViewHost*> >(&details)); 616 content::Details<std::pair<RenderViewHost*, RenderViewHost*> >(&details));
614 617
615 // If the pending view was on the swapped out list, we can remove it. 618 // If the pending view was on the swapped out list, we can remove it.
616 swapped_out_hosts_.erase(render_view_host_->site_instance()->id()); 619 swapped_out_hosts_.erase(render_view_host_->site_instance()->GetId());
617 620
618 // If the old RVH is live, we are swapping it out and should keep track of it 621 // If the old RVH is live, we are swapping it out and should keep track of it
619 // in case we navigate back to it. 622 // in case we navigate back to it.
620 if (old_render_view_host->IsRenderViewLive()) { 623 if (old_render_view_host->IsRenderViewLive()) {
621 DCHECK(old_render_view_host->is_swapped_out()); 624 DCHECK(old_render_view_host->is_swapped_out());
622 // Temp fix for http://crbug.com/90867 until we do a better cleanup to make 625 // Temp fix for http://crbug.com/90867 until we do a better cleanup to make
623 // sure we don't get different rvh instances for the same site instance 626 // sure we don't get different rvh instances for the same site instance
624 // in the same rvhmgr. 627 // in the same rvhmgr.
625 // TODO(creis): Clean this up. 628 // TODO(creis): Clean this up.
626 int32 old_site_instance_id = old_render_view_host->site_instance()->id(); 629 int32 old_site_instance_id = old_render_view_host->site_instance()->GetId();
627 RenderViewHostMap::iterator iter = 630 RenderViewHostMap::iterator iter =
628 swapped_out_hosts_.find(old_site_instance_id); 631 swapped_out_hosts_.find(old_site_instance_id);
629 if (iter != swapped_out_hosts_.end() && 632 if (iter != swapped_out_hosts_.end() &&
630 iter->second != old_render_view_host) { 633 iter->second != old_render_view_host) {
631 // Shutdown the RVH that will be replaced in the map to avoid a leak. 634 // Shutdown the RVH that will be replaced in the map to avoid a leak.
632 iter->second->Shutdown(); 635 iter->second->Shutdown();
633 } 636 }
634 swapped_out_hosts_[old_site_instance_id] = old_render_view_host; 637 swapped_out_hosts_[old_site_instance_id] = old_render_view_host;
635 } else { 638 } else {
636 old_render_view_host->Shutdown(); 639 old_render_view_host->Shutdown();
(...skipping 17 matching lines...) Expand all
654 // This will possibly create (set to NULL) a Web UI object for the pending 657 // This will possibly create (set to NULL) a Web UI object for the pending
655 // page. We'll use this later to give the page special access. This must 658 // page. We'll use this later to give the page special access. This must
656 // happen before the new renderer is created below so it will get bindings. 659 // happen before the new renderer is created below so it will get bindings.
657 // It must also happen after the above conditional call to CancelPending(), 660 // It must also happen after the above conditional call to CancelPending(),
658 // otherwise CancelPending may clear the pending_web_ui_ and the page will 661 // otherwise CancelPending may clear the pending_web_ui_ and the page will
659 // not have it's bindings set appropriately. 662 // not have it's bindings set appropriately.
660 pending_web_ui_.reset(delegate_->CreateWebUIForRenderManager(entry.GetURL())); 663 pending_web_ui_.reset(delegate_->CreateWebUIForRenderManager(entry.GetURL()));
661 664
662 // render_view_host_ will not be deleted before the end of this method, so we 665 // render_view_host_ will not be deleted before the end of this method, so we
663 // don't have to worry about this SiteInstance's ref count dropping to zero. 666 // don't have to worry about this SiteInstance's ref count dropping to zero.
664 SiteInstance* curr_instance = render_view_host_->site_instance(); 667 content::SiteInstance* curr_instance = render_view_host_->site_instance();
665 668
666 // Determine if we need a new SiteInstance for this entry. 669 // Determine if we need a new SiteInstance for this entry.
667 // Again, new_instance won't be deleted before the end of this method, so it 670 // Again, new_instance won't be deleted before the end of this method, so it
668 // is safe to use a normal pointer here. 671 // is safe to use a normal pointer here.
669 SiteInstance* new_instance = curr_instance; 672 content::SiteInstance* new_instance = curr_instance;
670 bool force_swap = ShouldSwapProcessesForNavigation( 673 bool force_swap = ShouldSwapProcessesForNavigation(
671 delegate_->GetLastCommittedNavigationEntryForRenderManager(), &entry); 674 delegate_->GetLastCommittedNavigationEntryForRenderManager(), &entry);
672 if (ShouldTransitionCrossSite() || force_swap) 675 if (ShouldTransitionCrossSite() || force_swap)
673 new_instance = GetSiteInstanceForEntry(entry, curr_instance); 676 new_instance = GetSiteInstanceForEntry(entry, curr_instance);
674 677
675 if (new_instance != curr_instance || force_swap) { 678 if (new_instance != curr_instance || force_swap) {
676 // New SiteInstance. 679 // New SiteInstance.
677 DCHECK(!cross_navigation_pending_); 680 DCHECK(!cross_navigation_pending_);
678 681
679 // Create a pending RVH and navigate it. 682 // Create a pending RVH and navigate it.
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 swapped_out_hosts_.erase(iter); 811 swapped_out_hosts_.erase(iter);
809 break; 812 break;
810 } 813 }
811 } 814 }
812 } 815 }
813 816
814 bool RenderViewHostManager::IsSwappedOut(RenderViewHost* rvh) { 817 bool RenderViewHostManager::IsSwappedOut(RenderViewHost* rvh) {
815 if (!rvh->site_instance()) 818 if (!rvh->site_instance())
816 return false; 819 return false;
817 820
818 return swapped_out_hosts_.find(rvh->site_instance()->id()) != 821 return swapped_out_hosts_.find(rvh->site_instance()->GetId()) !=
819 swapped_out_hosts_.end(); 822 swapped_out_hosts_.end();
820 } 823 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698