diff options
Diffstat (limited to 'content')
-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( |