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

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

Issue 358973005: Navigation transitions: Pass is_transition_navigation flag up to the embedder (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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 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/navigator_impl.h" 5 #include "content/browser/frame_host/navigator_impl.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "content/browser/frame_host/frame_tree.h" 8 #include "content/browser/frame_host/frame_tree.h"
9 #include "content/browser/frame_host/frame_tree_node.h" 9 #include "content/browser/frame_host/frame_tree_node.h"
10 #include "content/browser/frame_host/navigation_controller_impl.h" 10 #include "content/browser/frame_host/navigation_controller_impl.h"
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 delegate_(delegate) { 137 delegate_(delegate) {
138 } 138 }
139 139
140 NavigationController* NavigatorImpl::GetController() { 140 NavigationController* NavigatorImpl::GetController() {
141 return controller_; 141 return controller_;
142 } 142 }
143 143
144 void NavigatorImpl::DidStartProvisionalLoad( 144 void NavigatorImpl::DidStartProvisionalLoad(
145 RenderFrameHostImpl* render_frame_host, 145 RenderFrameHostImpl* render_frame_host,
146 int parent_routing_id, 146 int parent_routing_id,
147 const GURL& url) { 147 const GURL& url,
148 bool is_transition_navigation) {
148 bool is_error_page = (url.spec() == kUnreachableWebDataURL); 149 bool is_error_page = (url.spec() == kUnreachableWebDataURL);
149 bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL); 150 bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL);
150 GURL validated_url(url); 151 GURL validated_url(url);
151 RenderProcessHost* render_process_host = render_frame_host->GetProcess(); 152 RenderProcessHost* render_process_host = render_frame_host->GetProcess();
152 render_process_host->FilterURL(false, &validated_url); 153 render_process_host->FilterURL(false, &validated_url);
153 154
154 bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame(); 155 bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame();
155 NavigationEntryImpl* pending_entry = 156 NavigationEntryImpl* pending_entry =
156 NavigationEntryImpl::FromNavigationEntry(controller_->GetPendingEntry()); 157 NavigationEntryImpl::FromNavigationEntry(controller_->GetPendingEntry());
158
159 is_transition_navigation |= (pending_entry &&
160 pending_entry->is_transition_navigation());
161
157 if (is_main_frame) { 162 if (is_main_frame) {
158 // If there is no browser-initiated pending entry for this navigation and it 163 // If there is no browser-initiated pending entry for this navigation and it
159 // is not for the error URL, create a pending entry using the current 164 // is not for the error URL, create a pending entry using the current
160 // SiteInstance, and ensure the address bar updates accordingly. We don't 165 // SiteInstance, and ensure the address bar updates accordingly. We don't
161 // know the referrer or extra headers at this point, but the referrer will 166 // know the referrer or extra headers at this point, but the referrer will
162 // be set properly upon commit. 167 // be set properly upon commit.
163 bool has_browser_initiated_pending_entry = pending_entry && 168 bool has_browser_initiated_pending_entry = pending_entry &&
164 !pending_entry->is_renderer_initiated(); 169 !pending_entry->is_renderer_initiated();
165 if (!has_browser_initiated_pending_entry && !is_error_page) { 170 if (!has_browser_initiated_pending_entry && !is_error_page) {
166 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 171 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry(
(...skipping 11 matching lines...) Expand all
178 if (pending_entry) { 183 if (pending_entry) {
179 entry->set_transferred_global_request_id( 184 entry->set_transferred_global_request_id(
180 pending_entry->transferred_global_request_id()); 185 pending_entry->transferred_global_request_id());
181 entry->set_should_replace_entry(pending_entry->should_replace_entry()); 186 entry->set_should_replace_entry(pending_entry->should_replace_entry());
182 entry->SetRedirectChain(pending_entry->GetRedirectChain()); 187 entry->SetRedirectChain(pending_entry->GetRedirectChain());
183 } 188 }
184 controller_->SetPendingEntry(entry); 189 controller_->SetPendingEntry(entry);
185 if (delegate_) 190 if (delegate_)
186 delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL); 191 delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL);
187 } 192 }
193
194 if (delegate_ && is_transition_navigation)
195 delegate_->DidStartNavigationTransition(render_frame_host);
nasko 2014/07/03 09:39:30 Why add a full new delegate method when you are pa
oystein (OOO til 10th of July) 2014/07/22 00:02:43 I could pass it along to WebContentsObserver::DidS
188 } 196 }
189 197
190 if (delegate_) { 198 if (delegate_) {
191 // Notify the observer about the start of the provisional load. 199 // Notify the observer about the start of the provisional load.
192 delegate_->DidStartProvisionalLoad( 200 delegate_->DidStartProvisionalLoad(
193 render_frame_host, parent_routing_id, 201 render_frame_host, parent_routing_id,
194 validated_url, is_error_page, is_iframe_srcdoc); 202 validated_url, is_error_page, is_iframe_srcdoc);
195 } 203 }
196 } 204 }
197 205
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 // should "use up" the SiteInstance. 560 // should "use up" the SiteInstance.
553 return GetContentClient()->browser()->ShouldAssignSiteForURL(url); 561 return GetContentClient()->browser()->ShouldAssignSiteForURL(url);
554 } 562 }
555 563
556 void NavigatorImpl::RequestOpenURL( 564 void NavigatorImpl::RequestOpenURL(
557 RenderFrameHostImpl* render_frame_host, 565 RenderFrameHostImpl* render_frame_host,
558 const GURL& url, 566 const GURL& url,
559 const Referrer& referrer, 567 const Referrer& referrer,
560 WindowOpenDisposition disposition, 568 WindowOpenDisposition disposition,
561 bool should_replace_current_entry, 569 bool should_replace_current_entry,
562 bool user_gesture) { 570 bool user_gesture,
571 bool is_transition_navigation) {
563 SiteInstance* current_site_instance = 572 SiteInstance* current_site_instance =
564 GetRenderManager(render_frame_host)->current_frame_host()-> 573 GetRenderManager(render_frame_host)->current_frame_host()->
565 GetSiteInstance(); 574 GetSiteInstance();
566 // If this came from a swapped out RenderViewHost, we only allow the request 575 // If this came from a swapped out RenderViewHost, we only allow the request
567 // if we are still in the same BrowsingInstance. 576 // if we are still in the same BrowsingInstance.
568 if (render_frame_host->render_view_host()->IsSwappedOut() && 577 if (render_frame_host->render_view_host()->IsSwappedOut() &&
569 !render_frame_host->GetSiteInstance()->IsRelatedSiteInstance( 578 !render_frame_host->GetSiteInstance()->IsRelatedSiteInstance(
570 current_site_instance)) { 579 current_site_instance)) {
571 return; 580 return;
572 } 581 }
573 582
574 // Delegate to RequestTransferURL because this is just the generic 583 // Delegate to RequestTransferURL because this is just the generic
575 // case where |old_request_id| is empty. 584 // case where |old_request_id| is empty.
576 // TODO(creis): Pass the redirect_chain into this method to support client 585 // TODO(creis): Pass the redirect_chain into this method to support client
577 // redirects. http://crbug.com/311721. 586 // redirects. http://crbug.com/311721.
578 std::vector<GURL> redirect_chain; 587 std::vector<GURL> redirect_chain;
579 RequestTransferURL( 588 RequestTransferURL(
580 render_frame_host, url, redirect_chain, referrer, PAGE_TRANSITION_LINK, 589 render_frame_host, url, redirect_chain, referrer, PAGE_TRANSITION_LINK,
581 disposition, GlobalRequestID(), 590 disposition, GlobalRequestID(),
582 should_replace_current_entry, user_gesture); 591 should_replace_current_entry, user_gesture, is_transition_navigation);
583 } 592 }
584 593
585 void NavigatorImpl::RequestTransferURL( 594 void NavigatorImpl::RequestTransferURL(
586 RenderFrameHostImpl* render_frame_host, 595 RenderFrameHostImpl* render_frame_host,
587 const GURL& url, 596 const GURL& url,
588 const std::vector<GURL>& redirect_chain, 597 const std::vector<GURL>& redirect_chain,
589 const Referrer& referrer, 598 const Referrer& referrer,
590 PageTransition page_transition, 599 PageTransition page_transition,
591 WindowOpenDisposition disposition, 600 WindowOpenDisposition disposition,
592 const GlobalRequestID& transferred_global_request_id, 601 const GlobalRequestID& transferred_global_request_id,
593 bool should_replace_current_entry, 602 bool should_replace_current_entry,
594 bool user_gesture) { 603 bool user_gesture,
604 bool is_transition_navigation) {
595 GURL dest_url(url); 605 GURL dest_url(url);
596 SiteInstance* current_site_instance = 606 SiteInstance* current_site_instance =
597 GetRenderManager(render_frame_host)->current_frame_host()-> 607 GetRenderManager(render_frame_host)->current_frame_host()->
598 GetSiteInstance(); 608 GetSiteInstance();
599 if (!GetContentClient()->browser()->ShouldAllowOpenURL( 609 if (!GetContentClient()->browser()->ShouldAllowOpenURL(
600 current_site_instance, url)) { 610 current_site_instance, url)) {
601 dest_url = GURL(url::kAboutBlankURL); 611 dest_url = GURL(url::kAboutBlankURL);
602 } 612 }
603 613
604 int64 frame_tree_node_id = -1; 614 int64 frame_tree_node_id = -1;
605 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 615 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
606 frame_tree_node_id = 616 frame_tree_node_id =
607 render_frame_host->frame_tree_node()->frame_tree_node_id(); 617 render_frame_host->frame_tree_node()->frame_tree_node_id();
608 } 618 }
609 OpenURLParams params( 619 OpenURLParams params(
610 dest_url, referrer, frame_tree_node_id, disposition, page_transition, 620 dest_url, referrer, frame_tree_node_id, disposition, page_transition,
611 true /* is_renderer_initiated */); 621 true /* is_renderer_initiated */);
612 if (redirect_chain.size() > 0) 622 if (redirect_chain.size() > 0)
613 params.redirect_chain = redirect_chain; 623 params.redirect_chain = redirect_chain;
614 params.transferred_global_request_id = transferred_global_request_id; 624 params.transferred_global_request_id = transferred_global_request_id;
615 params.should_replace_current_entry = should_replace_current_entry; 625 params.should_replace_current_entry = should_replace_current_entry;
616 params.user_gesture = user_gesture; 626 params.user_gesture = user_gesture;
627 params.is_transition_navigation = is_transition_navigation;
617 628
618 if (GetRenderManager(render_frame_host)->web_ui()) { 629 if (GetRenderManager(render_frame_host)->web_ui()) {
619 // Web UI pages sometimes want to override the page transition type for 630 // Web UI pages sometimes want to override the page transition type for
620 // link clicks (e.g., so the new tab page can specify AUTO_BOOKMARK for 631 // link clicks (e.g., so the new tab page can specify AUTO_BOOKMARK for
621 // automatically generated suggestions). We don't override other types 632 // automatically generated suggestions). We don't override other types
622 // like TYPED because they have different implications (e.g., autocomplete). 633 // like TYPED because they have different implications (e.g., autocomplete).
623 if (PageTransitionCoreTypeIs(params.transition, PAGE_TRANSITION_LINK)) 634 if (PageTransitionCoreTypeIs(params.transition, PAGE_TRANSITION_LINK))
624 params.transition = 635 params.transition =
625 GetRenderManager(render_frame_host)->web_ui()-> 636 GetRenderManager(render_frame_host)->web_ui()->
626 GetLinkTransitionType(); 637 GetLinkTransitionType();
627 638
628 // Note also that we hide the referrer for Web UI pages. We don't really 639 // Note also that we hide the referrer for Web UI pages. We don't really
629 // want web sites to see a referrer of "chrome://blah" (and some 640 // want web sites to see a referrer of "chrome://blah" (and some
630 // chrome: URLs might have search terms or other stuff we don't want to 641 // chrome: URLs might have search terms or other stuff we don't want to
631 // send to the site), so we send no referrer. 642 // send to the site), so we send no referrer.
632 params.referrer = Referrer(); 643 params.referrer = Referrer();
633 644
634 // Navigations in Web UI pages count as browser-initiated navigations. 645 // Navigations in Web UI pages count as browser-initiated navigations.
635 params.is_renderer_initiated = false; 646 params.is_renderer_initiated = false;
636 } 647 }
637 648
638 if (delegate_) 649 if (delegate_)
639 delegate_->RequestOpenURL(render_frame_host, params); 650 delegate_->RequestOpenURL(render_frame_host, params);
640 } 651 }
641 652
642 } // namespace content 653 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698