File: first_scroll_delay_browsertest.cc

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (79 lines) | stat: -rw-r--r-- 3,327 bytes parent folder | download | duplicates (5)
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
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <vector>

#include "base/memory/raw_ptr.h"
#include "chrome/browser/page_load_metrics/integration_tests/metric_integration_test.h"
#include "content/public/test/browser_test_utils.h"

#include "build/build_config.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/page_load_metrics/browser/page_load_metrics_test_waiter.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/hit_test_region_observer.h"
#include "services/metrics/public/cpp/ukm_builders.h"

using ukm::builders::PageLoad;

IN_PROC_BROWSER_TEST_F(MetricIntegrationTest, FirstScrollDelay) {
  auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>(
      web_contents());
  waiter->AddPageExpectation(page_load_metrics::PageLoadMetricsTestWaiter::
                                 TimingField::kFirstScrollDelay);
  LoadHTML(R"HTML(
    <div id="content">
      <p>This is some text</p>
    </div>
    <script>
      // Stretch the content tall enough to be able to scroll the page.
      content.style.height = window.innerHeight * 2;
    </script>
  )HTML");

  // We should wait for the main frame's hit-test data to be ready before
  // sending the click event below to avoid flakiness.
  content::WaitForHitTestData(web_contents()->GetPrimaryMainFrame());
  // Ensure the compositor thread is ready for wheel events.
  content::MainThreadFrameObserver main_thread(GetRenderWidgetHost());
  main_thread.Wait();

  // With a |RenderFrameSubmissionObsever| we can block until the scroll
  // completes.
  content::RenderFrameSubmissionObserver frame_observer(web_contents());

  // Simulate scroll input.
  const gfx::Point mouse_position(50, 50);
  const float scroll_distance = 20.0;
  content::SimulateMouseEvent(web_contents(), blink::WebInputEvent::Type::kMouseMove,
                              mouse_position);
  content::SimulateMouseWheelEvent(web_contents(), mouse_position,
                                   gfx::Vector2d(0, -scroll_distance),
                                   blink::WebMouseWheelEvent::kPhaseBegan);
  content::SimulateMouseWheelEvent(web_contents(), mouse_position,
                                   gfx::Vector2d(0, 0),
                                   blink::WebMouseWheelEvent::kPhaseEnded);

  // Wait for the scroll to complete and the display to be updated.
  const float device_scale_factor =
      web_contents()->GetRenderWidgetHostView()->GetDeviceScaleFactor();
  frame_observer.WaitForScrollOffset(
      gfx::PointF(0, scroll_distance * device_scale_factor));

  waiter->Wait();

  // Navigate away.
  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));

  // Check UKM.
  std::vector<raw_ptr<const ukm::mojom::UkmEntry, VectorExperimental>> entries =
      ukm_recorder().GetEntriesByName(PageLoad::kEntryName);
  // There could be other metrics recorded for PageLoad; filter them out.
  std::erase_if(entries, [](const ukm::mojom::UkmEntry* entry) {
    return !ukm::TestUkmRecorder::EntryHasMetric(
        entry, PageLoad::kInteractiveTiming_FirstScrollDelayName);
  });
  EXPECT_EQ(1ul, entries.size());
}