Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index c95d6134a440ea27f0675f1a808f5068e46742e8..5a11cf04cf68ca7e9b7ca71727569eb75486e4bb 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -561,6 +561,7 @@ WebURLRequest CreateURLRequestForNavigation( |
const CommonNavigationParams& common_params, |
std::unique_ptr<StreamOverrideParameters> stream_override, |
bool is_view_source_mode_enabled, |
+ bool is_same_document_navigation, |
int nav_entry_id) { |
WebURLRequest request(common_params.url); |
if (is_view_source_mode_enabled) |
@@ -569,8 +570,7 @@ WebURLRequest CreateURLRequestForNavigation( |
request.setHTTPMethod(WebString::fromUTF8(common_params.method)); |
if (common_params.referrer.url.is_valid()) { |
WebString web_referrer = WebSecurityPolicy::generateReferrerHeader( |
- common_params.referrer.policy, |
- common_params.url, |
+ common_params.referrer.policy, common_params.url, |
WebString::fromUTF8(common_params.referrer.url.spec())); |
if (!web_referrer.isEmpty()) { |
request.setHTTPReferrer(web_referrer, common_params.referrer.policy); |
@@ -579,6 +579,7 @@ WebURLRequest CreateURLRequestForNavigation( |
} |
} |
+ request.setIsSameDocumentNavigation(is_same_document_navigation); |
request.setPreviewsState( |
static_cast<WebURLRequest::PreviewsState>(common_params.previews_state)); |
@@ -638,9 +639,13 @@ CommonNavigationParams MakeCommonNavigationParams( |
static_cast<FrameMsg_UILoadMetricsReportType::Value>( |
info.urlRequest.inputPerfMetricReportPolicy()); |
- // Determine the navigation type. |
+ // No history-navigation is expected to happen. |
+ DCHECK(info.navigationType != blink::WebNavigationTypeBackForward); |
+ |
+ // Determine the navigation type. No same-document navigation is expected |
+ // because it is loaded immediately by the FrameLoader. |
FrameMsg_Navigate_Type::Value navigation_type = |
- FrameMsg_Navigate_Type::NORMAL; |
+ FrameMsg_Navigate_Type::DIFFERENT_DOCUMENT; |
if (info.navigationType == blink::WebNavigationTypeReload) { |
if (load_flags & net::LOAD_BYPASS_CACHE) |
navigation_type = FrameMsg_Navigate_Type::RELOAD_BYPASSING_CACHE; |
@@ -667,37 +672,20 @@ media::Context3D GetSharedMainThreadContext3D( |
return media::Context3D(provider->ContextGL(), provider->GrContext()); |
} |
-bool IsReload(FrameMsg_Navigate_Type::Value navigation_type) { |
- switch (navigation_type) { |
- case FrameMsg_Navigate_Type::RELOAD: |
- case FrameMsg_Navigate_Type::RELOAD_BYPASSING_CACHE: |
- case FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL: |
- return true; |
- case FrameMsg_Navigate_Type::RESTORE: |
- case FrameMsg_Navigate_Type::RESTORE_WITH_POST: |
- case FrameMsg_Navigate_Type::NORMAL: |
- return false; |
- } |
- NOTREACHED(); |
- return false; |
-} |
- |
WebFrameLoadType ReloadFrameLoadTypeFor( |
FrameMsg_Navigate_Type::Value navigation_type) { |
switch (navigation_type) { |
case FrameMsg_Navigate_Type::RELOAD: |
case FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL: |
return WebFrameLoadType::ReloadMainResource; |
+ |
case FrameMsg_Navigate_Type::RELOAD_BYPASSING_CACHE: |
return WebFrameLoadType::ReloadBypassingCache; |
- case FrameMsg_Navigate_Type::RESTORE: |
- case FrameMsg_Navigate_Type::RESTORE_WITH_POST: |
- case FrameMsg_Navigate_Type::NORMAL: |
+ |
+ default: |
NOTREACHED(); |
return WebFrameLoadType::Standard; |
} |
- NOTREACHED(); |
- return WebFrameLoadType::Standard; |
} |
RenderFrameImpl::CreateRenderFrameImplFunction g_create_render_frame_impl = |
@@ -5181,7 +5169,8 @@ void RenderFrameImpl::OnFailedNavigation( |
bool has_stale_copy_in_cache, |
int error_code) { |
DCHECK(IsBrowserSideNavigationEnabled()); |
- bool is_reload = IsReload(common_params.navigation_type); |
+ bool is_reload = |
+ FrameMsg_Navigate_Type::IsReload(common_params.navigation_type); |
RenderFrameImpl::PrepareRenderViewForNavigation( |
common_params.url, request_params); |
@@ -5202,7 +5191,9 @@ void RenderFrameImpl::OnFailedNavigation( |
CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code); |
WebURLRequest failed_request = CreateURLRequestForNavigation( |
common_params, std::unique_ptr<StreamOverrideParameters>(), |
- frame_->isViewSourceModeEnabled(), request_params.nav_entry_id); |
+ frame_->isViewSourceModeEnabled(), |
+ false, // is_same_document_navigation |
+ request_params.nav_entry_id); |
if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) { |
// The browser expects this frame to be loading an error page. Inform it |
@@ -5829,7 +5820,8 @@ void RenderFrameImpl::NavigateInternal( |
// Lower bound for browser initiated navigation start time. |
base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); |
- bool is_reload = IsReload(common_params.navigation_type); |
+ bool is_reload = |
+ FrameMsg_Navigate_Type::IsReload(common_params.navigation_type); |
bool is_history_navigation = request_params.page_state.IsValid(); |
WebCachePolicy cache_policy = WebCachePolicy::UseProtocolCachePolicy; |
RenderFrameImpl::PrepareRenderViewForNavigation( |
@@ -5875,10 +5867,17 @@ void RenderFrameImpl::NavigateInternal( |
blink::WebHistoryDifferentDocumentLoad; |
bool should_load_request = false; |
WebHistoryItem item_for_history_navigation; |
- WebURLRequest request = |
- CreateURLRequestForNavigation(common_params, std::move(stream_params), |
- frame_->isViewSourceModeEnabled(), |
- request_params.nav_entry_id); |
+ |
+ // Enforce same-document navigation from the browser only if |
+ // browser-side-navigation is enabled. |
+ bool is_same_document = |
+ IsBrowserSideNavigationEnabled() && |
+ FrameMsg_Navigate_Type::IsSameDocument(common_params.navigation_type); |
+ |
+ WebURLRequest request = CreateURLRequestForNavigation( |
+ common_params, std::move(stream_params), |
+ frame_->isViewSourceModeEnabled(), is_same_document, |
+ request_params.nav_entry_id); |
request.setFrameType(IsTopLevelNavigation(frame_) |
? blink::WebURLRequest::FrameTypeTopLevel |
: blink::WebURLRequest::FrameTypeNested); |
@@ -5932,9 +5931,22 @@ void RenderFrameImpl::NavigateInternal( |
// store the relevant frame's WebHistoryItem in the root of the |
// PageState. |
item_for_history_navigation = entry->root(); |
- history_load_type = request_params.is_same_document_history_load |
- ? blink::WebHistorySameDocumentLoad |
- : blink::WebHistoryDifferentDocumentLoad; |
+ switch (common_params.navigation_type) { |
+ case FrameMsg_Navigate_Type::RELOAD: |
+ case FrameMsg_Navigate_Type::RELOAD_BYPASSING_CACHE: |
+ case FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL: |
+ case FrameMsg_Navigate_Type::RESTORE: |
+ case FrameMsg_Navigate_Type::RESTORE_WITH_POST: |
+ case FrameMsg_Navigate_Type::HISTORY_DIFFERENT_DOCUMENT: |
+ history_load_type = blink::WebHistoryDifferentDocumentLoad; |
+ break; |
+ case FrameMsg_Navigate_Type::HISTORY_SAME_DOCUMENT: |
+ history_load_type = blink::WebHistorySameDocumentLoad; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ history_load_type = blink::WebHistoryDifferentDocumentLoad; |
+ } |
load_type = request_params.is_history_navigation_in_new_child |
? blink::WebFrameLoadType::InitialHistoryLoad |
: blink::WebFrameLoadType::BackForward; |