summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-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(