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

Side by Side Diff: content/browser/frame_host/render_frame_host_manager.h

Issue 967383002: PlzNavigate: Avoid duplicate SiteInstance creation during navigation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Extract RFH selection logic form GetFrameHostForNavigation. Created 5 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 #ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ 5 #ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_
6 #define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ 6 #define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_
7 7
8 #include <list> 8 #include <list>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/weak_ptr.h" 13 #include "base/memory/weak_ptr.h"
14 #include "content/browser/renderer_host/render_view_host_delegate.h" 14 #include "content/browser/renderer_host/render_view_host_delegate.h"
15 #include "content/browser/site_instance_impl.h" 15 #include "content/browser/site_instance_impl.h"
16 #include "content/common/content_export.h" 16 #include "content/common/content_export.h"
17 #include "content/public/browser/global_request_id.h" 17 #include "content/public/browser/global_request_id.h"
18 #include "content/public/browser/notification_observer.h" 18 #include "content/public/browser/notification_observer.h"
19 #include "content/public/browser/notification_registrar.h" 19 #include "content/public/browser/notification_registrar.h"
20 #include "content/public/common/referrer.h" 20 #include "content/public/common/referrer.h"
21 #include "ui/base/page_transition_types.h" 21 #include "ui/base/page_transition_types.h"
22 22
23 struct FrameMsg_Navigate_Params; 23 struct FrameMsg_Navigate_Params;
24 24
25 namespace {
26 struct SiteInstanceDescriptor;
carlosk 2015/03/23 14:31:18 Instead of the lose |out_params| I preferred creat
clamy 2015/03/23 15:26:44 Unnamed namespaces are forbidden in header files.
carlosk 2015/03/23 17:39:19 Done.
27 }
28
25 namespace content { 29 namespace content {
26 class BrowserContext; 30 class BrowserContext;
27 class CrossProcessFrameConnector; 31 class CrossProcessFrameConnector;
28 class CrossSiteTransferringRequest; 32 class CrossSiteTransferringRequest;
29 class FrameTreeNode; 33 class FrameTreeNode;
30 class InterstitialPageImpl; 34 class InterstitialPageImpl;
31 class NavigationControllerImpl; 35 class NavigationControllerImpl;
32 class NavigationEntry; 36 class NavigationEntry;
33 class NavigationEntryImpl; 37 class NavigationEntryImpl;
34 class NavigationRequest; 38 class NavigationRequest;
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 419
416 void EnsureRenderViewInitialized(FrameTreeNode* source, 420 void EnsureRenderViewInitialized(FrameTreeNode* source,
417 RenderViewHostImpl* render_view_host, 421 RenderViewHostImpl* render_view_host,
418 SiteInstance* instance); 422 SiteInstance* instance);
419 423
420 private: 424 private:
421 friend class NavigatorTestWithBrowserSideNavigation; 425 friend class NavigatorTestWithBrowserSideNavigation;
422 friend class RenderFrameHostManagerTest; 426 friend class RenderFrameHostManagerTest;
423 friend class TestWebContents; 427 friend class TestWebContents;
424 428
429 enum RenderFrameHostToUse {
clamy 2015/03/23 15:26:44 This should be prefixed by a PlzNavigate comment t
carlosk 2015/03/23 17:39:19 Done. I also moved the friend-related macro below
430 INVALID,
431 REUSE_CURRENT,
432 NEW_SPECULATIVE,
433 REUSE_SPECULATIVE,
434 };
435
425 FRIEND_TEST_ALL_PREFIXES(CrossProcessFrameTreeBrowserTest, 436 FRIEND_TEST_ALL_PREFIXES(CrossProcessFrameTreeBrowserTest,
426 CreateCrossProcessSubframeProxies); 437 CreateCrossProcessSubframeProxies);
427 438
428 // Used with FrameTree::ForEach to erase RenderFrameProxyHosts from a 439 // Used with FrameTree::ForEach to erase RenderFrameProxyHosts from a
429 // FrameTreeNode's RenderFrameHostManager. 440 // FrameTreeNode's RenderFrameHostManager.
430 static bool ClearProxiesInSiteInstance(int32 site_instance_id, 441 static bool ClearProxiesInSiteInstance(int32 site_instance_id,
431 FrameTreeNode* node); 442 FrameTreeNode* node);
432 // Used with FrameTree::ForEach to reset initialized state of 443 // Used with FrameTree::ForEach to reset initialized state of
433 // RenderFrameProxyHosts from a FrameTreeNode's RenderFrameHostManager. 444 // RenderFrameProxyHosts from a FrameTreeNode's RenderFrameHostManager.
434 static bool ResetProxiesInSiteInstance(int32 site_instance_id, 445 static bool ResetProxiesInSiteInstance(int32 site_instance_id,
(...skipping 27 matching lines...) Expand all
462 // Creates a new Web UI, ensuring that the bindings are appropriate compared 473 // Creates a new Web UI, ensuring that the bindings are appropriate compared
463 // to |bindings|. 474 // to |bindings|.
464 scoped_ptr<WebUIImpl> CreateWebUI(const GURL& url, int bindings); 475 scoped_ptr<WebUIImpl> CreateWebUI(const GURL& url, int bindings);
465 476
466 // Returns true if it is safe to reuse the current WebUI when navigating from 477 // Returns true if it is safe to reuse the current WebUI when navigating from
467 // |current_entry| to |new_url|. 478 // |current_entry| to |new_url|.
468 bool ShouldReuseWebUI( 479 bool ShouldReuseWebUI(
469 const NavigationEntry* current_entry, 480 const NavigationEntry* current_entry,
470 const GURL& new_url) const; 481 const GURL& new_url) const;
471 482
483 // PlzNavigate
484 // Returns which RenderFrameHost should be used for the navigation among the
485 // possibilities defined by RenderFrameHostToUse.
486 scoped_refptr<SiteInstance> ChooseFrameHostForNavigation(
487 const NavigationRequest& request,
488 RenderFrameHostToUse* rfh_to_use);
carlosk 2015/03/23 14:31:18 The added logic to reuse the speculative RFH made
clamy 2015/03/23 15:26:44 I don't like the signature of this method either,
carlosk 2015/03/23 17:39:19 What I think is nice about the two methods is that
489
472 // Returns the SiteInstance to use for the navigation. 490 // Returns the SiteInstance to use for the navigation.
473 SiteInstance* GetSiteInstanceForNavigation(const GURL& dest_url, 491 SiteInstance* GetSiteInstanceForNavigation(const GURL& dest_url,
clamy 2015/03/23 15:26:44 Is GetSiteInstanceForNavigation idempotent in the
carlosk 2015/03/23 17:39:19 GetSiteInstanceForNavigation is not idempotent as
474 SiteInstance* source_instance, 492 SiteInstance* source_instance,
475 SiteInstance* dest_instance, 493 SiteInstance* dest_instance,
476 ui::PageTransition transition, 494 ui::PageTransition transition,
477 bool dest_is_restore, 495 bool dest_is_restore,
478 bool dest_is_view_source_mode); 496 bool dest_is_view_source_mode);
479 497
480 // Returns an appropriate SiteInstance object for the given |dest_url|, 498 // PlzNavigate
481 // possibly reusing the current SiteInstance. If --process-per-tab is used, 499 // Returns true if |candidate_instance| is a valid SiteInstance for a
482 // this is only called when ShouldSwapBrowsingInstancesForNavigation returns 500 // navigation to |dest_url| given all the provided context.
483 // true. |source_instance| is the SiteInstance of the frame that initiated the 501 bool IsCorrectSiteInstanceForURL(SiteInstance* candidate_instance,
484 // navigation. |current_instance| is the SiteInstance of the frame that is 502 const GURL& dest_url,
485 // currently navigating. |dest_instance|, is a predetermined SiteInstance 503 SiteInstance* source_instance,
486 // that'll be used if not null. 504 SiteInstance* dest_instance,
505 ui::PageTransition transition,
506 bool dest_is_restore,
507 bool dest_is_view_source_mode);
508
509 // Returns a descriptor of the appropriate SiteInstance object for the given
510 // |dest_url|, possibly reusing the current, source or destination
511 // SiteInstance. It will check ShouldTransitionCrossSite and
512 // ShouldSwapBrowsingInstancesForNavigation.
513 // |source_instance| is the SiteInstance of the frame that initiated the
514 // navigation. |dest_instance|, is a predetermined SiteInstance
515 // that'll be used if not null. Internally, |current_instance| is the
516 // SiteInstance of the frame that is currently navigating.
487 // For example, if you have a parent frame A, which has a child frame B, and 517 // For example, if you have a parent frame A, which has a child frame B, and
488 // A is trying to change the src attribute of B, this will cause a navigation 518 // A is trying to change the src attribute of B, this will cause a navigation
489 // where the source SiteInstance is A and B is the current SiteInstance. 519 // where the source SiteInstance is A and B is the current SiteInstance.
490 // This is a helper function for GetSiteInstanceForNavigation. 520 // This is a helper function for GetSiteInstanceForNavigation and
491 SiteInstance* GetSiteInstanceForURL(const GURL& dest_url, 521 // IsCorrectSiteInstanceForURL.
492 SiteInstance* source_instance, 522 SiteInstanceDescriptor DetermineSiteInstanceForURL(
493 SiteInstance* current_instance, 523 const GURL& dest_url,
494 SiteInstance* dest_instance, 524 SiteInstance* source_instance,
495 ui::PageTransition transition, 525 SiteInstance* dest_instance,
496 bool dest_is_restore, 526 ui::PageTransition transition,
497 bool dest_is_view_source_mode, 527 bool dest_is_restore,
498 bool force_browsing_instance_swap); 528 bool dest_is_view_source_mode);
529 SiteInstanceDescriptor DetermineSiteInstanceForURLInternal(
clamy 2015/03/23 15:26:44 Why do we have a DetermineSiteInstanceForURL and a
carlosk 2015/03/23 17:39:19 I guess you are asking about the DetermineSiteInst
530 const GURL& dest_url,
531 SiteInstance* source_instance,
532 SiteInstance* current_instance,
533 SiteInstance* dest_instance,
534 ui::PageTransition transition,
535 bool dest_is_restore,
536 bool dest_is_view_source_mode,
537 bool force_browsing_instance_swap);
carlosk 2015/03/23 14:31:18 I adapted this comment above so that it now fits w
499 538
500 // Determines the appropriate url to use as the current url for SiteInstance 539 // Determines the appropriate url to use as the current url for SiteInstance
501 // selection. 540 // selection.
502 const GURL& GetCurrentURLForSiteInstance( 541 const GURL& GetCurrentURLForSiteInstance(
503 SiteInstance* current_instance, 542 SiteInstance* current_instance,
504 NavigationEntry* current_entry); 543 NavigationEntry* current_entry);
505 544
506 // Creates a new RenderFrameHostImpl for the |new_instance| and assign it to 545 // Creates a new RenderFrameHostImpl for the |new_instance| and assign it to
507 // |pending_render_frame_host_| while respecting the opener route if needed 546 // |pending_render_frame_host_| while respecting the opener route if needed
508 // and stores it in pending_render_frame_host_. 547 // and stores it in pending_render_frame_host_.
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 bool should_reuse_web_ui_; 744 bool should_reuse_web_ui_;
706 745
707 base::WeakPtrFactory<RenderFrameHostManager> weak_factory_; 746 base::WeakPtrFactory<RenderFrameHostManager> weak_factory_;
708 747
709 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManager); 748 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManager);
710 }; 749 };
711 750
712 } // namespace content 751 } // namespace content
713 752
714 #endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ 753 #endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698