page_load_metrics_browsertest.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/test/bind.h"
  5. #include "base/test/metrics/histogram_tester.h"
  6. #include "build/build_config.h"
  7. #include "components/page_load_metrics/browser/page_load_metrics_observer.h"
  8. #include "components/page_load_metrics/browser/page_load_tracker.h"
  9. #include "net/test/embedded_test_server/embedded_test_server.h"
  10. #include "weblayer/browser/page_load_metrics_initialize.h"
  11. #include "weblayer/browser/profile_impl.h"
  12. #include "weblayer/test/weblayer_browser_test.h"
  13. #include "weblayer/test/weblayer_browser_test_utils.h"
  14. namespace weblayer {
  15. using PageLoadMetricsBrowserTest = WebLayerBrowserTest;
  16. class PageLoadMetricsObserver
  17. : public page_load_metrics::PageLoadMetricsObserver {
  18. public:
  19. explicit PageLoadMetricsObserver(base::RepeatingClosure quit_closure)
  20. : quit_closure_(quit_closure) {}
  21. ~PageLoadMetricsObserver() override = default;
  22. // page_load_metrics::PageLoadMetricsObserver implementation:
  23. ObservePolicy OnFencedFramesStart(
  24. content::NavigationHandle* navigation_handle,
  25. const GURL& currently_committed_url) override {
  26. // This class is only interested in events for outer-most frame that are
  27. // forwarded by PageLoadTracker. So, this class doesn't need observer-level
  28. // forwarding.
  29. return STOP_OBSERVING;
  30. }
  31. PageLoadMetricsObserver::ObservePolicy OnPrerenderStart(
  32. content::NavigationHandle* navigation_handle,
  33. const GURL& currently_committed_url) override {
  34. // Currently, prerendering is not enabled for WebLayer.
  35. //
  36. // TODO(https://crbug.com/1267224): If support prerendering, add callbacks
  37. // and tests.
  38. return STOP_OBSERVING;
  39. }
  40. void OnFirstPaintInPage(
  41. const page_load_metrics::mojom::PageLoadTiming& timing) override {
  42. on_first_paint_seen_ = true;
  43. QuitRunLoopIfReady();
  44. }
  45. void OnFirstContentfulPaintInPage(
  46. const page_load_metrics::mojom::PageLoadTiming& timing) override {
  47. on_first_contentful_paint_seen_ = true;
  48. QuitRunLoopIfReady();
  49. }
  50. private:
  51. void QuitRunLoopIfReady() {
  52. if (on_first_paint_seen_ && on_first_contentful_paint_seen_)
  53. quit_closure_.Run();
  54. }
  55. bool on_first_paint_seen_ = false;
  56. bool on_first_contentful_paint_seen_ = false;
  57. base::RepeatingClosure quit_closure_;
  58. };
  59. IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, Heartbeat) {
  60. base::HistogramTester histogram_tester;
  61. ASSERT_TRUE(embedded_test_server()->Start());
  62. base::RunLoop run_loop;
  63. auto callback = base::BindLambdaForTesting(
  64. [&](page_load_metrics::PageLoadTracker* tracker) {
  65. tracker->AddObserver(
  66. std::make_unique<PageLoadMetricsObserver>(run_loop.QuitClosure()));
  67. // Don't need this anymore
  68. SetRegisterEmbedderObserversForTesting(nullptr);
  69. });
  70. SetRegisterEmbedderObserversForTesting(&callback);
  71. NavigateAndWaitForCompletion(
  72. embedded_test_server()->GetURL("/simple_page.html"), shell());
  73. run_loop.Run();
  74. // Look for prefix because on Android the name would be different if the tab
  75. // is not in foreground initially. This seems to happen on a slow test bot.
  76. EXPECT_GE(histogram_tester
  77. .GetTotalCountsForPrefix(
  78. "PageLoad.PaintTiming.NavigationToFirstPaint")
  79. .size(),
  80. 1u);
  81. EXPECT_GE(histogram_tester
  82. .GetTotalCountsForPrefix(
  83. "PageLoad.PaintTiming.NavigationToFirstContentfulPaint")
  84. .size(),
  85. 1u);
  86. }
  87. IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, UserCounter) {
  88. base::HistogramTester histogram_tester;
  89. ASSERT_TRUE(embedded_test_server()->Start());
  90. NavigateAndWaitForCompletion(embedded_test_server()->GetURL("/form.html"),
  91. shell());
  92. NavigateAndWaitForCompletion(GURL("about:blank"), shell()); // Flush.
  93. histogram_tester.ExpectBucketCount("Blink.UseCounter.MainFrame.Features",
  94. blink::mojom::WebFeature::kPageVisits, 1);
  95. histogram_tester.ExpectBucketCount("Blink.UseCounter.Features",
  96. blink::mojom::WebFeature::kFormElement, 1);
  97. }
  98. } // namespace weblayer