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

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

Issue 2584513003: PlzNavigate: identify same-page browser-initiated navigation. (Closed)
Patch Set: Allow renderer-initiated reloads. Created 3 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
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/render_frame_host_impl.h" 5 #include "content/browser/frame_host/render_frame_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 2440 matching lines...) Expand 10 before | Expand all | Expand 10 after
2451 // Blink doesn't send throb notifications for JavaScript URLs, so it is not 2451 // Blink doesn't send throb notifications for JavaScript URLs, so it is not
2452 // done here either. 2452 // done here either.
2453 if (!common_params.url.SchemeIs(url::kJavaScriptScheme)) 2453 if (!common_params.url.SchemeIs(url::kJavaScriptScheme))
2454 OnDidStartLoading(true); 2454 OnDidStartLoading(true);
2455 } 2455 }
2456 2456
2457 void RenderFrameHostImpl::NavigateToInterstitialURL(const GURL& data_url) { 2457 void RenderFrameHostImpl::NavigateToInterstitialURL(const GURL& data_url) {
2458 DCHECK(data_url.SchemeIs(url::kDataScheme)); 2458 DCHECK(data_url.SchemeIs(url::kDataScheme));
2459 CommonNavigationParams common_params( 2459 CommonNavigationParams common_params(
2460 data_url, Referrer(), ui::PAGE_TRANSITION_LINK, 2460 data_url, Referrer(), ui::PAGE_TRANSITION_LINK,
2461 FrameMsg_Navigate_Type::NORMAL, false, false, base::TimeTicks::Now(), 2461 FrameMsg_Navigate_Type::DIFFERENT_DOCUMENT, false, false,
2462 FrameMsg_UILoadMetricsReportType::NO_REPORT, GURL(), GURL(), PREVIEWS_OFF, 2462 base::TimeTicks::Now(), FrameMsg_UILoadMetricsReportType::NO_REPORT,
2463 base::TimeTicks::Now(), "GET", nullptr); 2463 GURL(), GURL(), PREVIEWS_OFF, base::TimeTicks::Now(), "GET", nullptr);
2464 if (IsBrowserSideNavigationEnabled()) { 2464 if (IsBrowserSideNavigationEnabled()) {
2465 CommitNavigation(nullptr, nullptr, common_params, RequestNavigationParams(), 2465 CommitNavigation(nullptr, nullptr, common_params, RequestNavigationParams(),
2466 false); 2466 false);
2467 } else { 2467 } else {
2468 Navigate(common_params, StartNavigationParams(), RequestNavigationParams()); 2468 Navigate(common_params, StartNavigationParams(), RequestNavigationParams());
2469 } 2469 }
2470 } 2470 }
2471 2471
2472 void RenderFrameHostImpl::Stop() { 2472 void RenderFrameHostImpl::Stop() {
2473 Send(new FrameMsg_Stop(routing_id_)); 2473 Send(new FrameMsg_Stop(routing_id_));
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
2612 } 2612 }
2613 } 2613 }
2614 2614
2615 // PlzNavigate 2615 // PlzNavigate
2616 void RenderFrameHostImpl::CommitNavigation( 2616 void RenderFrameHostImpl::CommitNavigation(
2617 ResourceResponse* response, 2617 ResourceResponse* response,
2618 std::unique_ptr<StreamHandle> body, 2618 std::unique_ptr<StreamHandle> body,
2619 const CommonNavigationParams& common_params, 2619 const CommonNavigationParams& common_params,
2620 const RequestNavigationParams& request_params, 2620 const RequestNavigationParams& request_params,
2621 bool is_view_source) { 2621 bool is_view_source) {
2622 DCHECK((response && body.get()) || 2622 DCHECK(
2623 common_params.url.SchemeIs(url::kDataScheme) || 2623 (response && body.get()) ||
2624 !ShouldMakeNetworkRequestForURL(common_params.url) || 2624 common_params.url.SchemeIs(url::kDataScheme) ||
2625 IsRendererDebugURL(common_params.url)); 2625 !ShouldMakeNetworkRequestForURL(common_params.url) ||
2626 FrameMsg_Navigate_Type::IsSameDocument(common_params.navigation_type) ||
2627 IsRendererDebugURL(common_params.url));
2626 UpdatePermissionsForNavigation(common_params, request_params); 2628 UpdatePermissionsForNavigation(common_params, request_params);
2627 2629
2628 // Get back to a clean state, in case we start a new navigation without 2630 // Get back to a clean state, in case we start a new navigation without
2629 // completing an unload handler. 2631 // completing an unload handler.
2630 ResetWaitingState(); 2632 ResetWaitingState();
2631 2633
2632 // The renderer can exit view source mode when any error or cancellation 2634 // The renderer can exit view source mode when any error or cancellation
2633 // happen. When reusing the same renderer, overwrite to recover the mode. 2635 // happen. When reusing the same renderer, overwrite to recover the mode.
2634 if (is_view_source && 2636 if (is_view_source &&
2635 this == frame_tree_node_->render_manager()->current_frame_host()) { 2637 this == frame_tree_node_->render_manager()->current_frame_host()) {
2636 DCHECK(!GetParent()); 2638 DCHECK(!GetParent());
2637 render_view_host()->Send(new FrameMsg_EnableViewSourceMode(routing_id_)); 2639 render_view_host()->Send(new FrameMsg_EnableViewSourceMode(routing_id_));
2638 } 2640 }
2639 2641
2640 const GURL body_url = body.get() ? body->GetURL() : GURL(); 2642 const GURL body_url = body.get() ? body->GetURL() : GURL();
2641 const ResourceResponseHead head = response ? 2643 const ResourceResponseHead head = response ?
2642 response->head : ResourceResponseHead(); 2644 response->head : ResourceResponseHead();
2643 Send(new FrameMsg_CommitNavigation(routing_id_, head, body_url, common_params, 2645 Send(new FrameMsg_CommitNavigation(routing_id_, head, body_url, common_params,
2644 request_params)); 2646 request_params));
2645 2647
2646 // If a network request was made, update the Previews state. 2648 // If a network request was made, update the Previews state.
2647 if (ShouldMakeNetworkRequestForURL(common_params.url)) 2649 if (ShouldMakeNetworkRequestForURL(common_params.url) &&
2650 !FrameMsg_Navigate_Type::IsSameDocument(common_params.navigation_type)) {
2648 last_navigation_previews_state_ = common_params.previews_state; 2651 last_navigation_previews_state_ = common_params.previews_state;
2652 }
2649 2653
2650 // TODO(clamy): Release the stream handle once the renderer has finished 2654 // TODO(clamy): Release the stream handle once the renderer has finished
2651 // reading it. 2655 // reading it.
2652 stream_handle_ = std::move(body); 2656 stream_handle_ = std::move(body);
2653 2657
2654 // When navigating to a debug url, no commit is expected from the 2658 // When navigating to a debug url, no commit is expected from the
2655 // RenderFrameHost, nor should the throbber start. The NavigationRequest is 2659 // RenderFrameHost, nor should the throbber start. The NavigationRequest is
2656 // also not stored in the FrameTreeNode. Therefore do not reset it, as this 2660 // also not stored in the FrameTreeNode. Therefore do not reset it, as this
2657 // could cancel an existing pending navigation. 2661 // could cancel an existing pending navigation.
2658 if (!IsRendererDebugURL(common_params.url)) { 2662 if (!IsRendererDebugURL(common_params.url)) {
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
3313 } 3317 }
3314 3318
3315 void RenderFrameHostImpl::OnMediaInterfaceFactoryConnectionError() { 3319 void RenderFrameHostImpl::OnMediaInterfaceFactoryConnectionError() {
3316 DCHECK(media_interface_proxy_); 3320 DCHECK(media_interface_proxy_);
3317 media_interface_proxy_.reset(); 3321 media_interface_proxy_.reset();
3318 } 3322 }
3319 3323
3320 std::unique_ptr<NavigationHandleImpl> 3324 std::unique_ptr<NavigationHandleImpl>
3321 RenderFrameHostImpl::TakeNavigationHandleForCommit( 3325 RenderFrameHostImpl::TakeNavigationHandleForCommit(
3322 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 3326 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) {
3323 // If this is a same-page navigation, there isn't an existing NavigationHandle 3327 bool is_browser_initiated = (params.nav_entry_id != 0);
3324 // to use for the navigation. Create one, but don't reset any NavigationHandle 3328
3325 // tracking an ongoing navigation, since this may lead to the cancellation of
3326 // the navigation.
3327 if (params.was_within_same_page) { 3329 if (params.was_within_same_page) {
3328 // We don't ever expect navigation_handle_ to match, because handles are not 3330 if (IsBrowserSideNavigationEnabled()) {
3329 // created for same-page navigations. 3331 // When browser-side navigation is enabled, a NavigationHandle is created
3330 DCHECK(!navigation_handle_ || !navigation_handle_->IsSamePage()); 3332 // for browser-initiated same-page navigation. Try to take it if it's
3331 3333 // still available and matches the current navigation.
3334 if (is_browser_initiated && navigation_handle_ &&
3335 navigation_handle_->IsSamePage() &&
3336 navigation_handle_->GetURL() == params.url) {
3337 return std::move(navigation_handle_);
3338 }
3339 } else {
3340 // When browser-side navigation is disabled, there is never any existing
3341 // NavigationHandle to use for the navigation. We don't ever expect
3342 // navigation_handle_ to match.
3343 DCHECK(!navigation_handle_ || !navigation_handle_->IsSamePage());
3344 }
3345 // No existing NavigationHandle has been found. Create a new one, but don't
3346 // reset any NavigationHandle tracking an ongoing navigation, since this may
3347 // lead to the cancellation of the navigation.
3332 // First, determine if the navigation corresponds to the pending navigation 3348 // First, determine if the navigation corresponds to the pending navigation
3333 // entry. This is the case for a browser-initiated same-page navigation, 3349 // entry. This is the case for a browser-initiated same-page navigation,
3334 // which does not cause a NavigationHandle to be created because it does not 3350 // which does not cause a NavigationHandle to be created because it does not
3335 // go through DidStartProvisionalLoad. 3351 // go through DidStartProvisionalLoad.
3336 bool is_renderer_initiated = true; 3352 bool is_renderer_initiated = true;
3337 int pending_nav_entry_id = 0; 3353 int pending_nav_entry_id = 0;
3338 NavigationEntryImpl* pending_entry = 3354 NavigationEntryImpl* pending_entry =
3339 NavigationEntryImpl::FromNavigationEntry( 3355 NavigationEntryImpl::FromNavigationEntry(
3340 frame_tree_node()->navigator()->GetController()->GetPendingEntry()); 3356 frame_tree_node()->navigator()->GetController()->GetPendingEntry());
3341 if (pending_entry && pending_entry->GetUniqueID() == params.nav_entry_id) { 3357 if (pending_entry && pending_entry->GetUniqueID() == params.nav_entry_id) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3395 // There is no pending NavigationEntry in these cases, so pass 0 as the 3411 // There is no pending NavigationEntry in these cases, so pass 0 as the
3396 // pending_nav_entry_id. If the previous handle was a prematurely aborted 3412 // pending_nav_entry_id. If the previous handle was a prematurely aborted
3397 // navigation loaded via LoadDataWithBaseURL, propagate the entry id. 3413 // navigation loaded via LoadDataWithBaseURL, propagate the entry id.
3398 return NavigationHandleImpl::Create( 3414 return NavigationHandleImpl::Create(
3399 params.url, frame_tree_node_, is_renderer_initiated, 3415 params.url, frame_tree_node_, is_renderer_initiated,
3400 params.was_within_same_page, base::TimeTicks::Now(), 3416 params.was_within_same_page, base::TimeTicks::Now(),
3401 entry_id_for_data_nav, false); // started_from_context_menu 3417 entry_id_for_data_nav, false); // started_from_context_menu
3402 } 3418 }
3403 3419
3404 } // namespace content 3420 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698