diff options
author | Bo Liu <boliu@chromium.org> | 2016-03-18 11:42:48 -0700 |
---|---|---|
committer | Bo Liu <boliu@chromium.org> | 2016-03-18 18:46:32 +0000 |
commit | e75c76c3f346c4373ce1d3bb0a3548f0b115dfb9 (patch) | |
tree | 96603af926679002f09d450b477d498617f9fbb0 | |
parent | a69719e121cc0c8e5fecfaa65a8366cb65216f3c (diff) | |
download | chromium_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.cc | 40 | ||||
-rw-r--r-- | content/renderer/render_frame_impl.cc | 24 | ||||
-rw-r--r-- | content/renderer/render_frame_impl.h | 3 |
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( |