| Index: content/renderer/render_view_browsertest.cc
|
| diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
|
| index e3421a472f49714cdb5ef5edba4c8efecaa8eedd..6a23b252abdd2f99829fc05b14b181ae2b0f8aaf 100644
|
| --- a/content/renderer/render_view_browsertest.cc
|
| +++ b/content/renderer/render_view_browsertest.cc
|
| @@ -97,6 +97,7 @@
|
|
|
| #include "url/url_constants.h"
|
|
|
| +using base::TimeDelta;
|
| using blink::WebFrame;
|
| using blink::WebFrameContentDumper;
|
| using blink::WebInputEvent;
|
| @@ -189,6 +190,18 @@ FrameReplicationState ReconstructReplicationStateForTesting(
|
| return result;
|
| }
|
|
|
| +// Returns CommonNavigationParams for a normal navigation to a data: url, with
|
| +// navigation_start set to Now() plus the given offset.
|
| +CommonNavigationParams MakeCommonNavigationParams(
|
| + TimeDelta navigation_start_offset) {
|
| + CommonNavigationParams params;
|
| + params.url = GURL("data:text/html,<div>Page</div>");
|
| + params.navigation_start = base::TimeTicks::Now() + navigation_start_offset;
|
| + params.navigation_type = FrameMsg_Navigate_Type::NORMAL;
|
| + params.transition = ui::PAGE_TRANSITION_TYPED;
|
| + return params;
|
| +}
|
| +
|
| } // namespace
|
|
|
| class RenderViewImplTest : public RenderViewTest {
|
| @@ -247,7 +260,9 @@ class RenderViewImplTest : public RenderViewTest {
|
| const IPC::Message* message =
|
| render_thread_->sink().GetUniqueMessageMatching(T::ID);
|
| typename T::Param param;
|
| - T::Read(message, ¶m);
|
| + EXPECT_TRUE(message);
|
| + if (message)
|
| + T::Read(message, ¶m);
|
| return param;
|
| }
|
|
|
| @@ -376,6 +391,16 @@ class RenderViewImplTest : public RenderViewTest {
|
| PageMsg_SetZoomLevel_Command::USE_CURRENT_TEMPORARY_MODE, level);
|
| }
|
|
|
| + // Closes a view created during the test, i.e. not the |view()|. Checks that
|
| + // the main frame is detached and deleted, and makes sure the view does not
|
| + // leak.
|
| + void CloseRenderView(RenderViewImpl* new_view) {
|
| + new_view->Close();
|
| + EXPECT_FALSE(new_view->GetMainRenderFrame());
|
| +
|
| + new_view->Release();
|
| + }
|
| +
|
| private:
|
| std::unique_ptr<MockKeyboard> mock_keyboard_;
|
| };
|
| @@ -542,12 +567,8 @@ TEST_F(RenderViewImplTest, RenderFrameClearedAfterClose) {
|
| blink::WebNavigationPolicyNewForegroundTab, false);
|
| RenderViewImpl* new_view = RenderViewImpl::FromWebView(new_web_view);
|
|
|
| - // Close the view, causing the main RenderFrame to be detached and deleted.
|
| - new_view->Close();
|
| - EXPECT_FALSE(new_view->GetMainRenderFrame());
|
| -
|
| - // Clean up after the new view so we don't leak it.
|
| - new_view->Release();
|
| + // Checks that the frame is deleted properly and cleans up the view.
|
| + CloseRenderView(new_view);
|
| }
|
|
|
| // Test that we get form state change notifications when input fields change.
|
| @@ -824,9 +845,7 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicyForWebUI) {
|
| decidePolicyForNavigation(popup_policy_info);
|
| EXPECT_EQ(blink::WebNavigationPolicyIgnore, policy);
|
|
|
| - // Clean up after the new view so we don't leak it.
|
| - new_view->Close();
|
| - new_view->Release();
|
| + CloseRenderView(new_view);
|
| }
|
|
|
| // Verify that security origins are replicated properly to RenderFrameProxies
|
| @@ -954,8 +973,7 @@ TEST_F(RenderViewImplTest, PaintAfterSwapOut) {
|
| // Simulate getting painted after swapping out.
|
| new_view->DidFlushPaint();
|
|
|
| - new_view->Close();
|
| - new_view->Release();
|
| + CloseRenderView(new_view);
|
| }
|
|
|
| // Verify that the renderer process doesn't crash when device scale factor
|
| @@ -2026,19 +2044,42 @@ TEST_F(RenderViewImplTest, OnSetAccessibilityMode) {
|
| ASSERT_TRUE(frame()->render_accessibility());
|
| }
|
|
|
| +// Checks that when a navigation starts in the renderer, |navigation_start| is
|
| +// recorded at an appropriate time and is passed in the corresponding message.
|
| +TEST_F(RenderViewImplTest, RendererNavigationStartTransmittedToBrowser) {
|
| + base::TimeTicks lower_bound_navigation_start(base::TimeTicks::Now());
|
| + frame()->GetWebFrame()->loadHTMLString(
|
| + "hello world", blink::WebURL(GURL("data:text/html,")));
|
| +
|
| + FrameHostMsg_DidStartProvisionalLoad::Param host_nav_params =
|
| + ProcessAndReadIPC<FrameHostMsg_DidStartProvisionalLoad>();
|
| + base::TimeTicks transmitted_start = std::get<1>(host_nav_params);
|
| + EXPECT_FALSE(transmitted_start.is_null());
|
| + EXPECT_LT(lower_bound_navigation_start, transmitted_start);
|
| +}
|
| +
|
| +// Checks that a browser-initiated navigation in an initial document that was
|
| +// not accessed uses browser-side timestamp.
|
| +// This test assumes that |frame()| contains an unaccessed initial document at
|
| +// start.
|
| +TEST_F(RenderViewImplTest, BrowserNavigationStart) {
|
| + auto common_params = MakeCommonNavigationParams(-TimeDelta::FromSeconds(1));
|
| +
|
| + frame()->Navigate(common_params, StartNavigationParams(),
|
| + RequestNavigationParams());
|
| + FrameHostMsg_DidStartProvisionalLoad::Param nav_params =
|
| + ProcessAndReadIPC<FrameHostMsg_DidStartProvisionalLoad>();
|
| + EXPECT_EQ(common_params.navigation_start, std::get<1>(nav_params));
|
| +}
|
| +
|
| // 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().
|
| - CommonNavigationParams late_common_params;
|
| - late_common_params.url = GURL("data:text/html,<div>Another page</div>");
|
| - late_common_params.navigation_type = FrameMsg_Navigate_Type::NORMAL;
|
| - late_common_params.transition = ui::PAGE_TRANSITION_TYPED;
|
| - late_common_params.navigation_start =
|
| - base::TimeTicks::Now() + base::TimeDelta::FromDays(42);
|
| + auto late_common_params = MakeCommonNavigationParams(TimeDelta::FromDays(42));
|
| late_common_params.method = "POST";
|
|
|
| frame()->Navigate(late_common_params, StartNavigationParams(),
|
| @@ -2052,23 +2093,28 @@ TEST_F(RenderViewImplTest, NavigationStartOverride) {
|
| EXPECT_LE(late_nav_reported_start, after_navigation);
|
| }
|
|
|
| -TEST_F(RenderViewImplTest, RendererNavigationStartTransmittedToBrowser) {
|
| - base::TimeTicks lower_bound_navigation_start;
|
| - frame()->GetWebFrame()->loadHTMLString(
|
| - "hello world", blink::WebURL(GURL("data:text/html,")));
|
| - ProcessPendingMessages();
|
| - const IPC::Message* frame_navigate_msg =
|
| - render_thread_->sink().GetUniqueMessageMatching(
|
| - FrameHostMsg_DidStartProvisionalLoad::ID);
|
| - FrameHostMsg_DidStartProvisionalLoad::Param host_nav_params;
|
| - FrameHostMsg_DidStartProvisionalLoad::Read(frame_navigate_msg,
|
| - &host_nav_params);
|
| - base::TimeTicks transmitted_start = std::get<1>(host_nav_params);
|
| - EXPECT_FALSE(transmitted_start.is_null());
|
| - EXPECT_LT(lower_bound_navigation_start, transmitted_start);
|
| +// Checks that a browser-initiated navigation in an initial document that has
|
| +// been accessed does not use browser-side timestamp (there may be arbitrary
|
| +// content and/or scripts injected, including beforeunload handler that shows
|
| +// a confirmation dialog).
|
| +// If PlzNavigate is enabled, browser-side timestamp is always used.
|
| +TEST_F(RenderViewImplTest, NavigationStartWhenInitialDocumentWasAccessed) {
|
| + // Trigger a didAccessInitialDocument notification.
|
| + ExecuteJavaScriptForTests("document.title = 'Hi!';");
|
| +
|
| + auto common_params = MakeCommonNavigationParams(-TimeDelta::FromSeconds(1));
|
| + frame()->Navigate(common_params, StartNavigationParams(),
|
| + RequestNavigationParams());
|
| +
|
| + FrameHostMsg_DidStartProvisionalLoad::Param nav_params =
|
| + ProcessAndReadIPC<FrameHostMsg_DidStartProvisionalLoad>();
|
| + if (!IsBrowserSideNavigationEnabled())
|
| + EXPECT_GT(std::get<1>(nav_params), common_params.navigation_start);
|
| + else
|
| + EXPECT_EQ(common_params.navigation_start, std::get<1>(nav_params));
|
| }
|
|
|
| -TEST_F(RenderViewImplTest, BrowserNavigationStartNotUsedForReload) {
|
| +TEST_F(RenderViewImplTest, NavigationStartForReload) {
|
| const char url_string[] = "data:text/html,<div>Page</div>";
|
| // Navigate once, then reload.
|
| LoadHTML(url_string);
|
| @@ -2081,17 +2127,26 @@ 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 will
|
| + // be fired during Navigate.
|
| 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);
|
| +
|
| + if (!IsBrowserSideNavigationEnabled()) {
|
| + // The browser navigation_start should not be used because beforeunload was
|
| + // fired during Navigate.
|
| + EXPECT_PRED2(TimeTicksGT, std::get<1>(host_nav_params),
|
| + common_params.navigation_start);
|
| + } else {
|
| + // PlzNavigate: the browser navigation_start is always used.
|
| + EXPECT_EQ(common_params.navigation_start, std::get<1>(host_nav_params));
|
| + }
|
| }
|
|
|
| -TEST_F(RenderViewImplTest, BrowserNavigationStartNotUsedForHistoryNavigation) {
|
| +TEST_F(RenderViewImplTest, NavigationStartForSameProcessHistoryNavigation) {
|
| LoadHTML("<div id=pagename>Page A</div>");
|
| LoadHTML("<div id=pagename>Page B</div>");
|
| PageState back_state = GetCurrentPageState();
|
| @@ -2109,8 +2164,16 @@ TEST_F(RenderViewImplTest, BrowserNavigationStartNotUsedForHistoryNavigation) {
|
| StartNavigationParams(), RequestNavigationParams());
|
| FrameHostMsg_DidStartProvisionalLoad::Param host_nav_params =
|
| ProcessAndReadIPC<FrameHostMsg_DidStartProvisionalLoad>();
|
| - EXPECT_PRED2(TimeTicksGT, std::get<1>(host_nav_params),
|
| - common_params_back.navigation_start);
|
| + if (!IsBrowserSideNavigationEnabled()) {
|
| + // The browser navigation_start should not be used because beforeunload was
|
| + // fired during GoToOffsetWithParams.
|
| + EXPECT_PRED2(TimeTicksGT, std::get<1>(host_nav_params),
|
| + common_params_back.navigation_start);
|
| + } else {
|
| + // PlzNavigate: the browser navigation_start is always used.
|
| + EXPECT_EQ(common_params_back.navigation_start,
|
| + std::get<1>(host_nav_params));
|
| + }
|
| render_thread_->sink().ClearMessages();
|
|
|
| // Go forward.
|
| @@ -2122,18 +2185,28 @@ TEST_F(RenderViewImplTest, BrowserNavigationStartNotUsedForHistoryNavigation) {
|
| StartNavigationParams(), RequestNavigationParams());
|
| FrameHostMsg_DidStartProvisionalLoad::Param host_nav_params2 =
|
| ProcessAndReadIPC<FrameHostMsg_DidStartProvisionalLoad>();
|
| - EXPECT_PRED2(TimeTicksGT, std::get<1>(host_nav_params2),
|
| - common_params_forward.navigation_start);
|
| + if (!IsBrowserSideNavigationEnabled()) {
|
| + EXPECT_PRED2(TimeTicksGT, std::get<1>(host_nav_params2),
|
| + common_params_forward.navigation_start);
|
| + } else {
|
| + EXPECT_EQ(common_params_forward.navigation_start,
|
| + std::get<1>(host_nav_params2));
|
| + }
|
| }
|
|
|
| -TEST_F(RenderViewImplTest, BrowserNavigationStartSuccessfullyTransmitted) {
|
| - 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;
|
| +TEST_F(RenderViewImplTest, NavigationStartForCrossProcessHistoryNavigation) {
|
| + auto common_params = MakeCommonNavigationParams(-TimeDelta::FromSeconds(1));
|
| + common_params.transition = ui::PAGE_TRANSITION_FORWARD_BACK;
|
|
|
| - frame()->Navigate(common_params, StartNavigationParams(),
|
| - RequestNavigationParams());
|
| + RequestNavigationParams request_params;
|
| + request_params.page_state =
|
| + PageState::CreateForTesting(common_params.url, false, nullptr, nullptr);
|
| + request_params.page_id = 1;
|
| + request_params.nav_entry_id = 42;
|
| + request_params.pending_history_list_offset = 1;
|
| + request_params.current_history_list_offset = 0;
|
| + request_params.current_history_list_length = 1;
|
| + frame()->Navigate(common_params, StartNavigationParams(), request_params);
|
|
|
| FrameHostMsg_DidStartProvisionalLoad::Param host_nav_params =
|
| ProcessAndReadIPC<FrameHostMsg_DidStartProvisionalLoad>();
|
|
|