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

Unified Diff: content/browser/frame_host/navigator_impl.cc

Issue 1519943002: Shortcut cross-process frame transfers to avoid pending NavigationEntries. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove dead param Created 5 years 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/frame_host/navigator_impl.cc
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc
index 7050456b1a2a610c64db0f821abe8a29b61ea4e1..d38b0ddce1b242f52515d4f732f018925a7eee8a 100644
--- a/content/browser/frame_host/navigator_impl.cc
+++ b/content/browser/frame_host/navigator_impl.cc
@@ -579,33 +579,11 @@ void NavigatorImpl::RequestOpenURL(RenderFrameHostImpl* render_frame_host,
return;
}
- // Delegate to RequestTransferURL because this is just the generic
- // case where |old_request_id| is empty.
// TODO(creis): Pass the redirect_chain into this method to support client
// redirects. http://crbug.com/311721.
std::vector<GURL> redirect_chain;
- RequestTransferURL(render_frame_host, url, source_site_instance,
- redirect_chain, referrer, ui::PAGE_TRANSITION_LINK,
- disposition, GlobalRequestID(),
- should_replace_current_entry, user_gesture);
-}
-void NavigatorImpl::RequestTransferURL(
- RenderFrameHostImpl* render_frame_host,
- const GURL& url,
- SiteInstance* source_site_instance,
- const std::vector<GURL>& redirect_chain,
- const Referrer& referrer,
- ui::PageTransition page_transition,
- WindowOpenDisposition disposition,
- const GlobalRequestID& transferred_global_request_id,
- bool should_replace_current_entry,
- bool user_gesture) {
GURL dest_url(url);
- RenderFrameHostImpl* current_render_frame_host =
- GetRenderManager(render_frame_host)->current_frame_host();
- SiteInstance* current_site_instance =
- current_render_frame_host->GetSiteInstance();
if (!GetContentClient()->browser()->ShouldAllowOpenURL(
current_site_instance, url)) {
dest_url = GURL(url::kAboutBlankURL);
@@ -622,25 +600,26 @@ void NavigatorImpl::RequestTransferURL(
render_frame_host->frame_tree_node()->frame_tree_node_id();
}
- OpenURLParams params(
- dest_url, referrer, frame_tree_node_id, disposition, page_transition,
- true /* is_renderer_initiated */);
+ OpenURLParams params(dest_url, referrer, frame_tree_node_id, disposition,
+ ui::PAGE_TRANSITION_LINK,
+ true /* is_renderer_initiated */);
params.source_site_instance = source_site_instance;
if (redirect_chain.size() > 0)
params.redirect_chain = redirect_chain;
- params.transferred_global_request_id = transferred_global_request_id;
+ // TODO(creis): Remove transferred_global_request_id from OpenURLParams.
+ // See https://crbug.com/495161.
+ params.transferred_global_request_id = GlobalRequestID();
params.should_replace_current_entry = should_replace_current_entry;
params.user_gesture = user_gesture;
- if (current_render_frame_host->web_ui()) {
+ if (render_frame_host->web_ui()) {
// Web UI pages sometimes want to override the page transition type for
// link clicks (e.g., so the new tab page can specify AUTO_BOOKMARK for
// automatically generated suggestions). We don't override other types
// like TYPED because they have different implications (e.g., autocomplete).
if (ui::PageTransitionCoreTypeIs(
params.transition, ui::PAGE_TRANSITION_LINK))
- params.transition =
- current_render_frame_host->web_ui()->GetLinkTransitionType();
+ params.transition = render_frame_host->web_ui()->GetLinkTransitionType();
// Note also that we hide the referrer for Web UI pages. We don't really
// want web sites to see a referrer of "chrome://blah" (and some
@@ -656,6 +635,65 @@ void NavigatorImpl::RequestTransferURL(
delegate_->RequestOpenURL(render_frame_host, params);
}
+void NavigatorImpl::RequestTransferURL(
+ RenderFrameHostImpl* render_frame_host,
+ const GURL& url,
+ SiteInstance* source_site_instance,
+ const std::vector<GURL>& redirect_chain,
+ const Referrer& referrer,
+ ui::PageTransition page_transition,
+ WindowOpenDisposition disposition,
+ const GlobalRequestID& transferred_global_request_id,
+ bool should_replace_current_entry) {
+ // Allow the delegate to cancel the transfer.
+ if (!delegate_->ShouldTransferNavigation())
+ return;
+
+ GURL dest_url(url);
+ Referrer referrer_to_use(referrer);
+ FrameTreeNode* node = render_frame_host->frame_tree_node();
+ SiteInstance* current_site_instance = render_frame_host->GetSiteInstance();
+ if (!GetContentClient()->browser()->ShouldAllowOpenURL(current_site_instance,
+ url)) {
+ dest_url = GURL(url::kAboutBlankURL);
+ }
+
+ DCHECK_EQ(CURRENT_TAB, disposition);
+
+ // TODO(creis): Determine if this transfer started as a browser-initiated
+ // navigation. See https://crbug.com/495161.
+ bool is_renderer_initiated = true;
+ if (render_frame_host->web_ui()) {
+ // Web UI pages sometimes want to override the page transition type for
+ // link clicks (e.g., so the new tab page can specify AUTO_BOOKMARK for
+ // automatically generated suggestions). We don't override other types
+ // like TYPED because they have different implications (e.g., autocomplete).
+ if (ui::PageTransitionCoreTypeIs(page_transition, ui::PAGE_TRANSITION_LINK))
+ page_transition = render_frame_host->web_ui()->GetLinkTransitionType();
+
+ // Note also that we hide the referrer for Web UI pages. We don't really
+ // want web sites to see a referrer of "chrome://blah" (and some
+ // chrome: URLs might have search terms or other stuff we don't want to
+ // send to the site), so we send no referrer.
+ referrer_to_use = Referrer();
+
+ // Navigations in Web UI pages count as browser-initiated navigations.
+ is_renderer_initiated = false;
+ }
+
+ NavigationController::LoadURLParams load_url_params(dest_url);
+ load_url_params.source_site_instance = source_site_instance;
+ load_url_params.transition_type = page_transition;
+ load_url_params.frame_tree_node_id = node->frame_tree_node_id();
+ load_url_params.referrer = referrer_to_use;
+ load_url_params.redirect_chain = redirect_chain;
+ load_url_params.is_renderer_initiated = is_renderer_initiated;
+ load_url_params.transferred_global_request_id = transferred_global_request_id;
+ load_url_params.should_replace_current_entry = should_replace_current_entry;
+
+ controller_->LoadURLWithParams(load_url_params);
+}
+
// PlzNavigate
void NavigatorImpl::OnBeforeUnloadACK(FrameTreeNode* frame_tree_node,
bool proceed) {
« no previous file with comments | « content/browser/frame_host/navigator_impl.h ('k') | content/browser/frame_host/render_frame_host_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698