Index: content/renderer/render_view_browsertest.cc |
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc |
index 57747020cd76fa2e412df893ef676a95cfbfb620..3e032ae657eb216a1bf9b592cae18ecea3368d16 100644 |
--- a/content/renderer/render_view_browsertest.cc |
+++ b/content/renderer/render_view_browsertest.cc |
@@ -2039,10 +2039,33 @@ TEST_F(RenderViewImplTest, OnSetAccessibilityMode) { |
ASSERT_TRUE(frame()->render_accessibility()); |
} |
+TEST_F(RenderViewImplTest, BrowserNavigationStart) { |
+ base::TimeTicks browser_navigation_start = |
+ base::TimeTicks::Now() - base::TimeDelta::FromSeconds(1); |
+ CommonNavigationParams common_params; |
+ common_params.url = GURL("data:text/html,<div>Page</div>"); |
+ common_params.navigation_type = FrameMsg_Navigate_Type::NORMAL; |
+ common_params.transition = ui::PAGE_TRANSITION_TYPED; |
+ common_params.navigation_start = browser_navigation_start; |
+ |
+ frame()->Navigate(common_params, StartNavigationParams(), |
+ RequestNavigationParams()); |
+ ProcessPendingMessages(); |
+ |
+ blink::WebDataSource* ds = frame()->GetWebFrame()->dataSource(); |
+ ASSERT_TRUE(ds); |
+ DocumentState* document_state = DocumentState::FromDataSource(ds); |
Charlie Harrison
2016/06/28 14:01:43
Getting the navigation start from the document_sta
Alexander Semashko
2016/06/28 14:47:45
It's ok to take it from the IPC (to avoid comparin
Charlie Harrison
2016/06/28 15:54:15
Sounds good to me.
|
+ base::TimeTicks navigation_start = |
+ static_cast<NavigationStateImpl*>(document_state->navigation_state()) |
+ ->common_params().navigation_start; |
+ |
+ EXPECT_EQ(browser_navigation_start, navigation_start); |
+} |
+ |
// Sanity check for the Navigation Timing API |navigationStart| override. We |
// are asserting only most basic constraints, as TimeTicks (passed as the |
// override) are not comparable with the wall time (returned by the Blink API). |
-TEST_F(RenderViewImplTest, NavigationStartOverride) { |
+TEST_F(RenderViewImplTest, BrowserNavigationStartSanitized) { |
// Verify that a navigation that claims to have started in the future - 42 |
// days from now is *not* reported as one that starts in the future; as we |
// sanitize the override allowing a maximum of ::Now(). |
@@ -2081,6 +2104,32 @@ TEST_F(RenderViewImplTest, RendererNavigationStartTransmittedToBrowser) { |
EXPECT_LT(lower_bound_navigation_start, transmitted_start); |
} |
+TEST_F(RenderViewImplTest, FiringBeforeUnloadDiscardsBrowserNavigationStart) { |
+ const char url_string[] = "data:text/html,<script>" |
+ "window.onbeforeunload = function() {" |
+ " var finishTime = new Date().getTime() + 100;" |
+ " while (new Date() < finishTime) {}" |
+ " return null;" |
+ "};" |
+ "</script>"; |
+ LoadHTML(url_string); |
+ ProcessPendingMessages(); |
+ render_thread_->sink().ClearMessages(); |
+ |
+ CommonNavigationParams common_params; |
+ common_params.url = GURL("data:text/html,<div>Another page</div>"); |
+ common_params.navigation_type = FrameMsg_Navigate_Type::NORMAL; |
+ common_params.transition = ui::PAGE_TRANSITION_TYPED; |
+ |
+ frame()->Navigate(common_params, StartNavigationParams(), |
+ RequestNavigationParams()); |
+ |
+ FrameHostMsg_DidStartProvisionalLoad::Param host_nav_params = |
+ ProcessAndReadIPC<FrameHostMsg_DidStartProvisionalLoad>(); |
+ EXPECT_PRED2(TimeTicksGT, std::get<1>(host_nav_params), |
+ common_params.navigation_start); |
+} |
+ |
TEST_F(RenderViewImplTest, BrowserNavigationStartNotUsedForReload) { |
const char url_string[] = "data:text/html,<div>Page</div>"; |
// Navigate once, then reload. |
@@ -2094,17 +2143,19 @@ TEST_F(RenderViewImplTest, BrowserNavigationStartNotUsedForReload) { |
FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; |
common_params.transition = ui::PAGE_TRANSITION_RELOAD; |
+ // The browser navigation_start should not be used because beforeunload was |
+ // not fired yet. |
Charlie Harrison
2016/06/28 14:01:43
This comment is unclear. If we're getting the DidS
Alexander Semashko
2016/06/28 14:47:45
I meant that it is not fired at the moment where t
|
frame()->Navigate(common_params, StartNavigationParams(), |
RequestNavigationParams()); |
FrameHostMsg_DidStartProvisionalLoad::Param host_nav_params = |
ProcessAndReadIPC<FrameHostMsg_DidStartProvisionalLoad>(); |
- // The true timestamp is later than the browser initiated one. |
EXPECT_PRED2(TimeTicksGT, std::get<1>(host_nav_params), |
common_params.navigation_start); |
} |
-TEST_F(RenderViewImplTest, BrowserNavigationStartNotUsedForHistoryNavigation) { |
+TEST_F(RenderViewImplTest, |
+ BrowserNavigationStartNotUsedForSameProcessHistoryNavigation) { |
LoadHTML("<div id=pagename>Page A</div>"); |
LoadHTML("<div id=pagename>Page B</div>"); |
PageState back_state = GetCurrentPageState(); |