summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBo Liu <boliu@chromium.org>2016-03-18 11:42:48 -0700
committerBo Liu <boliu@chromium.org>2016-03-18 18:46:32 +0000
commite75c76c3f346c4373ce1d3bb0a3548f0b115dfb9 (patch)
tree96603af926679002f09d450b477d498617f9fbb0
parenta69719e121cc0c8e5fecfaa65a8366cb65216f3c (diff)
downloadchromium_src-e75c76c3f346c4373ce1d3bb0a3548f0b115dfb9.zip
chromium_src-e75c76c3f346c4373ce1d3bb0a3548f0b115dfb9.tar.gz
chromium_src-e75c76c3f346c4373ce1d3bb0a3548f0b115dfb9.tar.bz2
[Merge M49] Fix in-page navigation after LoadDataWithBaseURL
This is a follow up fix to r361481. After r361481 additional info about a LoadDataWithBaseURL is stored in DocumentState. However, if there is an in-page fragment navigation, this additional info is just thrown away, causing incorrect behavior. Fix this by not updating this additional info for in-page navigations. Note this is NOT a fix for crbug.com/561034, which describes a similar problem, but on the browser side. BUG=594611 CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:linux_site_isolation Review URL: https://codereview.chromium.org/1802383004 Cr-Commit-Position: refs/heads/master@{#381588} (cherry picked from commit ac512fd1188a7bd1e1e752bd46990acd72b6bdb6) Review URL: https://codereview.chromium.org/1813353002 . Cr-Commit-Position: refs/branch-heads/2623@{#633} Cr-Branched-From: 92d77538a86529ca35f9220bd3cd512cbea1f086-refs/heads/master@{#369907}
-rw-r--r--content/browser/frame_host/navigation_controller_impl_browsertest.cc40
-rw-r--r--content/renderer/render_frame_impl.cc24
-rw-r--r--content/renderer/render_frame_impl.h3
3 files changed, 57 insertions, 10 deletions
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
index 8e9a73c..5ead376 100644
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -199,6 +199,46 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
}
}
+IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
+ FragmentNavigateFromLoadDataWithBaseURL) {
+ const GURL base_url("http://baseurl");
+ const GURL history_url("http://historyurl");
+ const std::string data =
+ "<html><body>"
+ " <p id=\"frag\"><a id=\"fraglink\" href=\"#frag\">in-page nav</a></p>"
+ "</body></html>";
+
+ const NavigationControllerImpl& controller =
+ static_cast<const NavigationControllerImpl&>(
+ shell()->web_contents()->GetController());
+
+ // Load data and commit.
+ TestNavigationObserver same_tab_observer(shell()->web_contents(), 1);
+#if defined(OS_ANDROID)
+ shell()->LoadDataAsStringWithBaseURL(history_url, data, base_url);
+#else
+ shell()->LoadDataWithBaseURL(history_url, data, base_url);
+#endif
+ same_tab_observer.Wait();
+ EXPECT_EQ(1, controller.GetEntryCount());
+ const GURL data_url = controller.GetLastCommittedEntry()->GetURL();
+
+ // Perform a fragment navigation using a javascript: URL.
+ GURL js_url("javascript:document.location = '#frag';");
+ NavigateToURL(shell(), js_url);
+ EXPECT_EQ(2, controller.GetEntryCount());
+ NavigationEntryImpl* entry = controller.GetLastCommittedEntry();
+ // TODO(boliu): These expectations maybe incorrect due to crbug.com/561034.
+ EXPECT_TRUE(entry->GetBaseURLForDataURL().is_empty());
+ EXPECT_TRUE(entry->GetHistoryURLForDataURL().is_empty());
+ EXPECT_EQ(data_url, entry->GetVirtualURL());
+ EXPECT_EQ(data_url, entry->GetURL());
+
+ // Passes if renderer is still alive.
+ EXPECT_TRUE(
+ ExecuteScript(shell()->web_contents(), "console.log('Success');"));
+}
+
IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, UniqueIDs) {
const NavigationControllerImpl& controller =
static_cast<const NavigationControllerImpl&>(
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 592cd08..7aeebd2 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2872,7 +2872,7 @@ void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame,
// The rest of RenderView assumes that a WebDataSource will always have a
// non-null NavigationState.
- UpdateNavigationState(document_state);
+ UpdateNavigationState(document_state, false /* was_within_same_page */);
// DocumentState::referred_by_prefetcher_ is true if we are
// navigating from a page that used prefetching using a link on that
@@ -3442,7 +3442,7 @@ void RenderFrameImpl::didNavigateWithinPage(blink::WebLocalFrame* frame,
// UpdateNavigationState conveniently takes care of this for us.
DocumentState* document_state =
DocumentState::FromDataSource(frame->dataSource());
- UpdateNavigationState(document_state);
+ UpdateNavigationState(document_state, true /* was_within_same_page */);
static_cast<NavigationStateImpl*>(document_state->navigation_state())
->set_was_within_same_page(true);
@@ -5598,7 +5598,8 @@ NavigationState* RenderFrameImpl::CreateNavigationStateFromPending() {
return NavigationStateImpl::CreateContentInitiated();
}
-void RenderFrameImpl::UpdateNavigationState(DocumentState* document_state) {
+void RenderFrameImpl::UpdateNavigationState(DocumentState* document_state,
+ bool was_within_same_page) {
if (pending_navigation_params_) {
// If this is a browser-initiated load that doesn't override
// navigation_start, set it here.
@@ -5610,12 +5611,17 @@ void RenderFrameImpl::UpdateNavigationState(DocumentState* document_state) {
const CommonNavigationParams& common_params =
pending_navigation_params_->common_params;
- bool load_data = !common_params.base_url_for_data_url.is_empty() &&
- !common_params.history_url_for_data_url.is_empty() &&
- common_params.url.SchemeIs(url::kDataScheme);
- document_state->set_was_load_data_with_base_url_request(load_data);
- if (load_data)
- document_state->set_data_url(common_params.url);
+ // The |set_was_load_data_with_base_url_request| state should not change for
+ // an in-page navigation, so skip updating it from the in-page navigation
+ // params in this case.
+ if (!was_within_same_page) {
+ bool load_data = !common_params.base_url_for_data_url.is_empty() &&
+ !common_params.history_url_for_data_url.is_empty() &&
+ common_params.url.SchemeIs(url::kDataScheme);
+ document_state->set_was_load_data_with_base_url_request(load_data);
+ if (load_data)
+ document_state->set_data_url(common_params.url);
+ }
pending_navigation_params_.reset();
} else {
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 72fd2a7..923af084 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -908,7 +908,8 @@ class CONTENT_EXPORT RenderFrameImpl
// Sets the NavigationState on the DocumentState based on
// the value of |pending_navigation_params_|.
- void UpdateNavigationState(DocumentState* document_state);
+ void UpdateNavigationState(DocumentState* document_state,
+ bool was_within_same_page);
#if defined(OS_ANDROID)
blink::WebMediaPlayer* CreateAndroidWebMediaPlayer(