| OLD | NEW |
| 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/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 941 #endif | 941 #endif |
| 942 IPC_END_MESSAGE_MAP() | 942 IPC_END_MESSAGE_MAP() |
| 943 | 943 |
| 944 return handled; | 944 return handled; |
| 945 } | 945 } |
| 946 | 946 |
| 947 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { | 947 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { |
| 948 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", | 948 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", |
| 949 "id", routing_id_, | 949 "id", routing_id_, |
| 950 "url", params.common_params.url.possibly_invalid_spec()); | 950 "url", params.common_params.url.possibly_invalid_spec()); |
| 951 |
| 951 bool is_reload = | 952 bool is_reload = |
| 952 RenderViewImpl::IsReload(params.common_params.navigation_type); | 953 RenderViewImpl::IsReload(params.common_params.navigation_type); |
| 954 bool is_history_navigation = params.commit_params.page_state.IsValid(); |
| 953 WebURLRequest::CachePolicy cache_policy = | 955 WebURLRequest::CachePolicy cache_policy = |
| 954 WebURLRequest::UseProtocolCachePolicy; | 956 WebURLRequest::UseProtocolCachePolicy; |
| 955 if (!RenderFrameImpl::PrepareRenderViewForNavigation( | 957 if (!RenderFrameImpl::PrepareRenderViewForNavigation( |
| 956 params.common_params.url, params.common_params.navigation_type, | 958 params.common_params.url, params.common_params.navigation_type, |
| 957 params.commit_params.page_state, true, params.pending_history_list_offset, | 959 params.commit_params.page_state, true, is_history_navigation, |
| 958 params.page_id, &is_reload, &cache_policy)) { | 960 params.current_history_list_offset, params.page_id, &is_reload, |
| 961 &cache_policy)) { |
| 959 Send(new FrameHostMsg_DidDropNavigation(routing_id_)); | 962 Send(new FrameHostMsg_DidDropNavigation(routing_id_)); |
| 960 return; | 963 return; |
| 961 } | 964 } |
| 962 | 965 |
| 963 int pending_history_list_offset = params.pending_history_list_offset; | 966 render_view_->history_list_offset_ = params.current_history_list_offset; |
| 964 int current_history_list_offset = params.current_history_list_offset; | 967 render_view_->history_list_length_ = params.current_history_list_length; |
| 965 int current_history_list_length = params.current_history_list_length; | |
| 966 if (params.should_clear_history_list) { | 968 if (params.should_clear_history_list) { |
| 967 CHECK_EQ(pending_history_list_offset, -1); | 969 CHECK_EQ(-1, render_view_->history_list_offset_); |
| 968 CHECK_EQ(current_history_list_offset, -1); | 970 CHECK_EQ(0, render_view_->history_list_length_); |
| 969 CHECK_EQ(current_history_list_length, 0); | |
| 970 } | |
| 971 render_view_->history_list_offset_ = current_history_list_offset; | |
| 972 render_view_->history_list_length_ = current_history_list_length; | |
| 973 if (render_view_->history_list_length_ >= 0) { | |
| 974 render_view_->history_page_ids_.resize( | |
| 975 render_view_->history_list_length_, -1); | |
| 976 } | |
| 977 if (pending_history_list_offset >= 0 && | |
| 978 pending_history_list_offset < render_view_->history_list_length_) { | |
| 979 render_view_->history_page_ids_[pending_history_list_offset] = | |
| 980 params.page_id; | |
| 981 } | 971 } |
| 982 | 972 |
| 983 GetContentClient()->SetActiveURL(params.common_params.url); | 973 GetContentClient()->SetActiveURL(params.common_params.url); |
| 984 | 974 |
| 985 WebFrame* frame = frame_; | 975 WebFrame* frame = frame_; |
| 986 if (!params.frame_to_navigate.empty()) { | 976 if (!params.frame_to_navigate.empty()) { |
| 987 // TODO(nasko): Move this lookup to the browser process. | 977 // TODO(nasko): Move this lookup to the browser process. |
| 988 frame = render_view_->webview()->findFrameByName( | 978 frame = render_view_->webview()->findFrameByName( |
| 989 WebString::fromUTF8(params.frame_to_navigate)); | 979 WebString::fromUTF8(params.frame_to_navigate)); |
| 990 CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate; | 980 CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1008 bool reload_original_url = | 998 bool reload_original_url = |
| 1009 (params.common_params.navigation_type == | 999 (params.common_params.navigation_type == |
| 1010 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); | 1000 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); |
| 1011 bool ignore_cache = (params.common_params.navigation_type == | 1001 bool ignore_cache = (params.common_params.navigation_type == |
| 1012 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); | 1002 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); |
| 1013 | 1003 |
| 1014 if (reload_original_url) | 1004 if (reload_original_url) |
| 1015 frame->reloadWithOverrideURL(params.common_params.url, true); | 1005 frame->reloadWithOverrideURL(params.common_params.url, true); |
| 1016 else | 1006 else |
| 1017 frame->reload(ignore_cache); | 1007 frame->reload(ignore_cache); |
| 1018 } else if (params.commit_params.page_state.IsValid()) { | 1008 } else if (is_history_navigation) { |
| 1019 // We must know the page ID of the page we are navigating back to. | 1009 // We must know the page ID of the page we are navigating back to. |
| 1020 DCHECK_NE(params.page_id, -1); | 1010 DCHECK_NE(params.page_id, -1); |
| 1021 scoped_ptr<HistoryEntry> entry = | 1011 scoped_ptr<HistoryEntry> entry = |
| 1022 PageStateToHistoryEntry(params.commit_params.page_state); | 1012 PageStateToHistoryEntry(params.commit_params.page_state); |
| 1023 if (entry) { | 1013 if (entry) { |
| 1024 // Ensure we didn't save the swapped out URL in UpdateState, since the | 1014 // Ensure we didn't save the swapped out URL in UpdateState, since the |
| 1025 // browser should never be telling us to navigate to swappedout://. | 1015 // browser should never be telling us to navigate to swappedout://. |
| 1026 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); | 1016 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); |
| 1027 render_view_->history_controller()->GoToEntry(entry.Pass(), cache_policy); | 1017 render_view_->history_controller()->GoToEntry(entry.Pass(), cache_policy); |
| 1028 } | 1018 } |
| (...skipping 1331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2360 render_view_->webview()->resetScrollAndScaleState(); | 2350 render_view_->webview()->resetScrollAndScaleState(); |
| 2361 internal_data->set_must_reset_scroll_and_scale_state(false); | 2351 internal_data->set_must_reset_scroll_and_scale_state(false); |
| 2362 } | 2352 } |
| 2363 internal_data->set_use_error_page(false); | 2353 internal_data->set_use_error_page(false); |
| 2364 | 2354 |
| 2365 bool is_new_navigation = commit_type == blink::WebStandardCommit; | 2355 bool is_new_navigation = commit_type == blink::WebStandardCommit; |
| 2366 if (is_new_navigation) { | 2356 if (is_new_navigation) { |
| 2367 // We bump our Page ID to correspond with the new session history entry. | 2357 // We bump our Page ID to correspond with the new session history entry. |
| 2368 render_view_->page_id_ = render_view_->next_page_id_++; | 2358 render_view_->page_id_ = render_view_->next_page_id_++; |
| 2369 | 2359 |
| 2370 // Don't update history_page_ids_ (etc) for kSwappedOutURL, since | 2360 // Don't update history list values for kSwappedOutURL, since |
| 2371 // we don't want to forget the entry that was there, and since we will | 2361 // we don't want to forget the entry that was there, and since we will |
| 2372 // never come back to kSwappedOutURL. Note that we have to call | 2362 // never come back to kSwappedOutURL. Note that we have to call |
| 2373 // UpdateSessionHistory and update page_id_ even in this case, so that | 2363 // UpdateSessionHistory and update page_id_ even in this case, so that |
| 2374 // the current entry gets a state update and so that we don't send a | 2364 // the current entry gets a state update and so that we don't send a |
| 2375 // state update to the wrong entry when we swap back in. | 2365 // state update to the wrong entry when we swap back in. |
| 2376 if (GetLoadingUrl() != GURL(kSwappedOutURL)) { | 2366 if (GetLoadingUrl() != GURL(kSwappedOutURL)) { |
| 2377 // Advance our offset in session history, applying the length limit. | 2367 // Advance our offset in session history, applying the length limit. |
| 2378 // There is now no forward history. | 2368 // There is now no forward history. |
| 2379 render_view_->history_list_offset_++; | 2369 render_view_->history_list_offset_++; |
| 2380 if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries) | 2370 if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries) |
| 2381 render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1; | 2371 render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1; |
| 2382 render_view_->history_list_length_ = | 2372 render_view_->history_list_length_ = |
| 2383 render_view_->history_list_offset_ + 1; | 2373 render_view_->history_list_offset_ + 1; |
| 2384 render_view_->history_page_ids_.resize( | |
| 2385 render_view_->history_list_length_, -1); | |
| 2386 render_view_->history_page_ids_[render_view_->history_list_offset_] = | |
| 2387 render_view_->page_id_; | |
| 2388 } | 2374 } |
| 2389 } else { | 2375 } else { |
| 2390 // Inspect the navigation_state on this frame to see if the navigation | 2376 // Inspect the navigation_state on this frame to see if the navigation |
| 2391 // corresponds to a session history navigation... Note: |frame| may or | 2377 // corresponds to a session history navigation... Note: |frame| may or |
| 2392 // may not be the toplevel frame, but for the case of capturing session | 2378 // may not be the toplevel frame, but for the case of capturing session |
| 2393 // history, the first committed frame suffices. We keep track of whether | 2379 // history, the first committed frame suffices. We keep track of whether |
| 2394 // we've seen this commit before so that only capture session history once | 2380 // we've seen this commit before so that only capture session history once |
| 2395 // per navigation. | 2381 // per navigation. |
| 2396 // | 2382 // |
| 2397 // Note that we need to check if the page ID changed. In the case of a | 2383 // Note that we need to check if the page ID changed. In the case of a |
| 2398 // reload, the page ID doesn't change, and UpdateSessionHistory gets the | 2384 // reload, the page ID doesn't change, and UpdateSessionHistory gets the |
| 2399 // previous URL and the current page ID, which would be wrong. | 2385 // previous URL and the current page ID, which would be wrong. |
| 2400 if (navigation_state->pending_page_id() != -1 && | 2386 if (navigation_state->pending_page_id() != -1 && |
| 2401 navigation_state->pending_page_id() != render_view_->page_id_ && | 2387 navigation_state->pending_page_id() != render_view_->page_id_ && |
| 2402 !navigation_state->request_committed()) { | 2388 !navigation_state->request_committed()) { |
| 2403 // This is a successful session history navigation! | 2389 // This is a successful session history navigation! |
| 2404 render_view_->page_id_ = navigation_state->pending_page_id(); | 2390 render_view_->page_id_ = navigation_state->pending_page_id(); |
| 2405 | 2391 |
| 2406 render_view_->history_list_offset_ = | 2392 render_view_->history_list_offset_ = |
| 2407 navigation_state->pending_history_list_offset(); | 2393 navigation_state->pending_history_list_offset(); |
| 2408 | |
| 2409 // If the history list is valid, our list of page IDs should be correct. | |
| 2410 DCHECK(render_view_->history_list_length_ <= 0 || | |
| 2411 render_view_->history_list_offset_ < 0 || | |
| 2412 render_view_->history_list_offset_ >= | |
| 2413 render_view_->history_list_length_ || | |
| 2414 render_view_->history_page_ids_[render_view_->history_list_offset_] | |
| 2415 == render_view_->page_id_); | |
| 2416 } | 2394 } |
| 2417 } | 2395 } |
| 2418 | 2396 |
| 2419 bool sent = Send( | 2397 bool sent = Send( |
| 2420 new FrameHostMsg_DidAssignPageId(routing_id_, render_view_->page_id_)); | 2398 new FrameHostMsg_DidAssignPageId(routing_id_, render_view_->page_id_)); |
| 2421 CHECK(sent); // http://crbug.com/407376 | 2399 CHECK(sent); // http://crbug.com/407376 |
| 2422 | 2400 |
| 2423 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, | 2401 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, |
| 2424 DidCommitProvisionalLoad(frame, is_new_navigation)); | 2402 DidCommitProvisionalLoad(frame, is_new_navigation)); |
| 2425 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | 2403 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
| (...skipping 1276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3702 | 3680 |
| 3703 // PlzNavigate | 3681 // PlzNavigate |
| 3704 void RenderFrameImpl::OnCommitNavigation( | 3682 void RenderFrameImpl::OnCommitNavigation( |
| 3705 const ResourceResponseHead& response, | 3683 const ResourceResponseHead& response, |
| 3706 const GURL& stream_url, | 3684 const GURL& stream_url, |
| 3707 const CommonNavigationParams& common_params, | 3685 const CommonNavigationParams& common_params, |
| 3708 const CommitNavigationParams& commit_params) { | 3686 const CommitNavigationParams& commit_params) { |
| 3709 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 3687 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
| 3710 switches::kEnableBrowserSideNavigation)); | 3688 switches::kEnableBrowserSideNavigation)); |
| 3711 bool is_reload = false; | 3689 bool is_reload = false; |
| 3690 bool is_history_navigation = commit_params.page_state.IsValid(); |
| 3712 WebURLRequest::CachePolicy cache_policy = | 3691 WebURLRequest::CachePolicy cache_policy = |
| 3713 WebURLRequest::UseProtocolCachePolicy; | 3692 WebURLRequest::UseProtocolCachePolicy; |
| 3714 if (!RenderFrameImpl::PrepareRenderViewForNavigation( | 3693 if (!RenderFrameImpl::PrepareRenderViewForNavigation( |
| 3715 common_params.url, common_params.navigation_type, | 3694 common_params.url, common_params.navigation_type, |
| 3716 commit_params.page_state, false, -1, -1, &is_reload, &cache_policy)) { | 3695 commit_params.page_state, false /* check_for_stale_navigation */, |
| 3696 is_history_navigation, -1 /* current_history_list_offset; TODO(clamy)*/, |
| 3697 -1, &is_reload, &cache_policy)) { |
| 3717 return; | 3698 return; |
| 3718 } | 3699 } |
| 3719 | 3700 |
| 3720 GetContentClient()->SetActiveURL(common_params.url); | 3701 GetContentClient()->SetActiveURL(common_params.url); |
| 3721 | 3702 |
| 3722 // Create a WebURLRequest that blink can use to get access to the body of the | 3703 // Create a WebURLRequest that blink can use to get access to the body of the |
| 3723 // response through a stream in the browser. Blink will then commit the | 3704 // response through a stream in the browser. Blink will then commit the |
| 3724 // navigation. | 3705 // navigation. |
| 3725 // TODO(clamy): Have the navigation commit directly, without going through | 3706 // TODO(clamy): Have the navigation commit directly, without going through |
| 3726 // loading a WebURLRequest. | 3707 // loading a WebURLRequest. |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4128 #else | 4109 #else |
| 4129 return scoped_ptr<MediaStreamRendererFactory>( | 4110 return scoped_ptr<MediaStreamRendererFactory>( |
| 4130 static_cast<MediaStreamRendererFactory*>(NULL)); | 4111 static_cast<MediaStreamRendererFactory*>(NULL)); |
| 4131 #endif | 4112 #endif |
| 4132 } | 4113 } |
| 4133 | 4114 |
| 4134 bool RenderFrameImpl::PrepareRenderViewForNavigation( | 4115 bool RenderFrameImpl::PrepareRenderViewForNavigation( |
| 4135 const GURL& url, | 4116 const GURL& url, |
| 4136 FrameMsg_Navigate_Type::Value navigate_type, | 4117 FrameMsg_Navigate_Type::Value navigate_type, |
| 4137 const PageState& state, | 4118 const PageState& state, |
| 4138 bool check_history, | 4119 bool check_for_stale_navigation, |
| 4139 int pending_history_list_offset, | 4120 bool is_history_navigation, |
| 4121 int current_history_list_offset, |
| 4140 int32 page_id, | 4122 int32 page_id, |
| 4141 bool* is_reload, | 4123 bool* is_reload, |
| 4142 WebURLRequest::CachePolicy* cache_policy) { | 4124 WebURLRequest::CachePolicy* cache_policy) { |
| 4143 MaybeHandleDebugURL(url); | 4125 MaybeHandleDebugURL(url); |
| 4144 if (!render_view_->webview()) | 4126 if (!render_view_->webview()) |
| 4145 return false; | 4127 return false; |
| 4146 | 4128 |
| 4147 FOR_EACH_OBSERVER( | 4129 FOR_EACH_OBSERVER( |
| 4148 RenderViewObserver, render_view_->observers_, Navigate(url)); | 4130 RenderViewObserver, render_view_->observers_, Navigate(url)); |
| 4149 | 4131 |
| 4150 // If this is a stale back/forward (due to a recent navigation the browser | 4132 // If this is a stale back/forward (due to a recent navigation the browser |
| 4151 // didn't know about), ignore it. | 4133 // didn't know about), ignore it. Only check if swapped in because if the |
| 4152 if (check_history && render_view_->IsBackForwardToStaleEntry( | 4134 // frame is swapped out, it won't commit before asking the browser. |
| 4153 state, pending_history_list_offset, page_id, *is_reload)) | 4135 // TODO(clamy): remove check_for_stale_navigation |
| 4136 if (check_for_stale_navigation && |
| 4137 !render_view_->is_swapped_out() && is_history_navigation && |
| 4138 render_view_->history_list_offset_ != current_history_list_offset) { |
| 4154 return false; | 4139 return false; |
| 4140 } |
| 4155 | 4141 |
| 4156 if (!is_swapped_out_ || frame_->parent()) | 4142 if (!is_swapped_out_ || frame_->parent()) |
| 4157 return true; | 4143 return true; |
| 4158 | 4144 |
| 4159 // This is a swapped out main frame, so swap the renderer back in. | 4145 // This is a swapped out main frame, so swap the renderer back in. |
| 4160 // We marked the view as hidden when swapping the view out, so be sure to | 4146 // We marked the view as hidden when swapping the view out, so be sure to |
| 4161 // reset the visibility state before navigating to the new URL. | 4147 // reset the visibility state before navigating to the new URL. |
| 4162 render_view_->webview()->setVisibilityState( | 4148 render_view_->webview()->setVisibilityState( |
| 4163 render_view_->visibilityState(), false); | 4149 render_view_->visibilityState(), false); |
| 4164 | 4150 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4267 | 4253 |
| 4268 #if defined(ENABLE_BROWSER_CDMS) | 4254 #if defined(ENABLE_BROWSER_CDMS) |
| 4269 RendererCdmManager* RenderFrameImpl::GetCdmManager() { | 4255 RendererCdmManager* RenderFrameImpl::GetCdmManager() { |
| 4270 if (!cdm_manager_) | 4256 if (!cdm_manager_) |
| 4271 cdm_manager_ = new RendererCdmManager(this); | 4257 cdm_manager_ = new RendererCdmManager(this); |
| 4272 return cdm_manager_; | 4258 return cdm_manager_; |
| 4273 } | 4259 } |
| 4274 #endif // defined(ENABLE_BROWSER_CDMS) | 4260 #endif // defined(ENABLE_BROWSER_CDMS) |
| 4275 | 4261 |
| 4276 } // namespace content | 4262 } // namespace content |
| OLD | NEW |