File: offline_page_navigation_throttle_unittest.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (138 lines) | stat: -rw-r--r-- 5,863 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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/offline_pages/offline_page_navigation_throttle.h"

#include <memory>

#include "base/test/metrics/histogram_tester.h"
#include "content/public/test/mock_navigation_handle.h"
#include "content/public/test/mock_navigation_throttle_registry.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace offline_pages {
namespace {

class OfflinePageNavigationThrottleTest : public testing::Test {
 public:
  void SetUp() override {
    histogram_tester_ = std::make_unique<base::HistogramTester>();
  }

  base::HistogramTester* histogram_tester() { return histogram_tester_.get(); }

  // Creates a MockNavigationHandle and configures it based on the input param
  std::unique_ptr<content::MockNavigationHandle> MakeMockNavigationHandle(
      bool is_renderer_initiated,
      bool has_offline_headers) {
    std::unique_ptr<content::MockNavigationHandle> navigation_handle =
        std::make_unique<content::MockNavigationHandle>();
    navigation_handle->set_is_renderer_initiated(is_renderer_initiated);

    net::HttpRequestHeaders request_headers;
    if (has_offline_headers) {
      request_headers.SetHeader(
          "X-Chrome-offline",
          "persist=1 reason=file_url_intent intent_url=not_a_real_file");
    }
    navigation_handle->set_request_headers(request_headers);

    return navigation_handle;
  }

  // Create a NavigationThrottleRegistry and configure it with the
  // MockNavigationHandle
  std::unique_ptr<content::MockNavigationThrottleRegistry>
  MakeMockNavigationThrottleRegistry(
      content::MockNavigationHandle* navigation_handle) {
    return std::make_unique<content::MockNavigationThrottleRegistry>(
        navigation_handle,
        content::MockNavigationThrottleRegistry::RegistrationMode::kHold);
  }

 private:
  std::unique_ptr<base::HistogramTester> histogram_tester_;
};

TEST_F(OfflinePageNavigationThrottleTest, CancelOfflineRequestFromRenderer) {
  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
      MakeMockNavigationHandle(/*is_renderer_initiated=*/true,
                               /*has_offline_headers=*/true);
  std::unique_ptr<content::MockNavigationThrottleRegistry>
      navigation_throttle_registry =
          MakeMockNavigationThrottleRegistry(navigation_handle.get());

  OfflinePageNavigationThrottle::MaybeCreateAndAdd(
      *navigation_throttle_registry);

  // Checks that a non-null OfflinePageNavigationThrottle was created, and a
  // value of true was logged to UMA.
  ASSERT_EQ(navigation_throttle_registry->throttles().size(), 1u);
  histogram_tester()->ExpectUniqueSample(
      kOfflinePagesDidNavigationThrottleCancelNavigation, true, 1);

  // Ensure that the created throttle specifies to cancel and ignore the
  // navigation request.
  content::NavigationThrottle::ThrottleCheckResult throttle_check_result =
      navigation_throttle_registry->throttles().back()->WillStartRequest();
  EXPECT_EQ(throttle_check_result.action(),
            content::NavigationThrottle::CANCEL_AND_IGNORE);
}

TEST_F(OfflinePageNavigationThrottleTest, AllowOfflineRequestFromBrowser) {
  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
      MakeMockNavigationHandle(/*is_renderer_initiated=*/false,
                               /*has_offline_headers=*/true);
  std::unique_ptr<content::MockNavigationThrottleRegistry>
      navigation_throttle_registry =
          MakeMockNavigationThrottleRegistry(navigation_handle.get());
  OfflinePageNavigationThrottle::MaybeCreateAndAdd(
      *navigation_throttle_registry);

  // Checks that a OfflinePageNavigationThrottle wasn't created and instead a
  // nullptr was returned. Additionally checks that a value of false was logged
  // to UMA.
  EXPECT_EQ(navigation_throttle_registry->throttles().size(), 0u);
  histogram_tester()->ExpectUniqueSample(
      kOfflinePagesDidNavigationThrottleCancelNavigation, false, 1);
}

TEST_F(OfflinePageNavigationThrottleTest, AllowRegularRequestFromRenderer) {
  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
      MakeMockNavigationHandle(/*is_renderer_initiated=*/true,
                               /*has_offline_headers=*/false);
  std::unique_ptr<content::MockNavigationThrottleRegistry>
      navigation_throttle_registry =
          MakeMockNavigationThrottleRegistry(navigation_handle.get());
  OfflinePageNavigationThrottle::MaybeCreateAndAdd(
      *navigation_throttle_registry);

  // Checks that a OfflinePageNavigationThrottle wasn't created and instead a
  // nullptr was returned. Additionally checks that a value of false was logged
  // to UMA.
  EXPECT_EQ(navigation_throttle_registry->throttles().size(), 0u);
  histogram_tester()->ExpectUniqueSample(
      kOfflinePagesDidNavigationThrottleCancelNavigation, false, 1);
}

TEST_F(OfflinePageNavigationThrottleTest, AllowRegularRequestFromBrowser) {
  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
      MakeMockNavigationHandle(/*is_renderer_initiated=*/false,
                               /*has_offline_headers=*/false);
  std::unique_ptr<content::MockNavigationThrottleRegistry>
      navigation_throttle_registry =
          MakeMockNavigationThrottleRegistry(navigation_handle.get());
  OfflinePageNavigationThrottle::MaybeCreateAndAdd(
      *navigation_throttle_registry);

  // Checks that a OfflinePageNavigationThrottle wasn't created and instead a
  // nullptr was returned. Additionally checks that a value of false was logged
  // to UMA.
  EXPECT_EQ(navigation_throttle_registry->throttles().size(), 0u);
  histogram_tester()->ExpectUniqueSample(
      kOfflinePagesDidNavigationThrottleCancelNavigation, false, 1);
}

}  // namespace
}  // namespace offline_pages