summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/loader/document_load_timing_test.cc
blob: b8a40733cb080ee2e2ecb4d69fd4775617bda790 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "third_party/blink/renderer/core/loader/document_load_timing.h"

#include <memory>
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/loader/document_loader.h"
#include "third_party/blink/renderer/core/testing/dummy_page_holder.h"

namespace blink {

class DocumentLoadTimingTest : public testing::Test {};

TEST_F(DocumentLoadTimingTest, ensureValidNavigationStartAfterEmbedder) {
  std::unique_ptr<DummyPageHolder> dummy_page = DummyPageHolder::Create();
  DocumentLoadTiming timing(*(dummy_page->GetDocument().Loader()));

  double delta = -1000;
  double embedder_navigation_start = CurrentTimeTicksInSeconds() + delta;
  timing.SetNavigationStart(TimeTicksFromSeconds(embedder_navigation_start));

  double real_wall_time = CurrentTime();
  TimeDelta adjusted_wall_time =
      timing.MonotonicTimeToPseudoWallTime(timing.NavigationStart());

  EXPECT_NEAR(adjusted_wall_time.InSecondsF(), real_wall_time + delta, .001);
}

TEST_F(DocumentLoadTimingTest, correctTimingDeltas) {
  std::unique_ptr<DummyPageHolder> dummy_page = DummyPageHolder::Create();
  DocumentLoadTiming timing(*(dummy_page->GetDocument().Loader()));

  double navigation_start_delta = -456;
  double current_monotonic_time = CurrentTimeTicksInSeconds();
  double embedder_navigation_start =
      current_monotonic_time + navigation_start_delta;

  timing.SetNavigationStart(TimeTicksFromSeconds(embedder_navigation_start));

  // Super quick load! Expect the wall time reported by this event to be
  // dominated by the navigationStartDelta, but similar to currentTime().
  timing.MarkLoadEventEnd();
  double real_wall_load_event_end = CurrentTime();
  TimeDelta adjusted_load_event_end =
      timing.MonotonicTimeToPseudoWallTime(timing.LoadEventEnd());

  EXPECT_NEAR(adjusted_load_event_end.InSecondsF(), real_wall_load_event_end,
              .001);

  TimeDelta adjusted_navigation_start =
      timing.MonotonicTimeToPseudoWallTime(timing.NavigationStart());
  EXPECT_NEAR(
      (adjusted_load_event_end - adjusted_navigation_start).InSecondsF(),
      -navigation_start_delta, .001);
}

TEST_F(DocumentLoadTimingTest, ensureRedirectEndExcludesNextFetch) {
  // Regression test for https://crbug.com/823254.

  std::unique_ptr<DummyPageHolder> dummy_page = DummyPageHolder::Create();
  DocumentLoadTiming timing(*(dummy_page->GetDocument().Loader()));

  base::TimeTicks origin;
  auto t1 = base::TimeDelta::FromSeconds(5);
  auto t2 = base::TimeDelta::FromSeconds(10);

  // Start a navigation to |url_that_redirects|.
  timing.SetNavigationStart(origin);

  // Simulate a redirect taking |t1| seconds.
  timing.SetRedirectStart(origin);
  origin += t1;
  timing.SetRedirectEnd(origin);

  // Start fetching |url_that_loads|.
  timing.SetFetchStart(origin);

  // Track the redirection.
  KURL url_that_redirects("some_url");
  KURL url_that_loads("some_other_url");
  timing.AddRedirect(url_that_redirects, url_that_loads);

  // Simulate |t2| seconds elapsing between fetchStart and responseEnd.
  origin += t2;
  timing.SetResponseEnd(origin);

  // The bug was causing |redirectEnd| - |redirectStart| ~= |t1| + |t2| when it
  // should be just |t1|.
  double redirect_time_ms =
      (timing.RedirectEnd() - timing.RedirectStart()).InMillisecondsF();
  EXPECT_NEAR(redirect_time_ms, t1.InMillisecondsF(), 1.0);
}
}  // namespace blink