12
12
#include " base/functional/bind.h"
13
13
#include " base/path_service.h"
14
14
#include " base/run_loop.h"
15
+ #include " base/strings/strcat.h"
15
16
#include " base/strings/string_util.h"
16
17
#include " base/test/scoped_feature_list.h"
17
18
#include " brave/components/constants/brave_paths.h"
@@ -36,6 +37,8 @@ const char KClientHintsMetaHTTPEquivAcceptCH[] =
36
37
" /ch-meta-http-equiv-accept-ch.html" ;
37
38
const char KClientHintsMetaNameAcceptCH[] = " /ch-meta-name-accept-ch.html" ;
38
39
40
+ const char kPlatformVersionClientHintPatchValue [] = " x" ;
41
+
39
42
const std::reference_wrapper<const base::Feature> kTestFeatures [] = {
40
43
// Individual hints features
41
44
blink::features::kClientHintsDeviceMemory ,
@@ -93,23 +96,30 @@ class ClientHintsBrowserTest
93
96
94
97
void SetUp () override {
95
98
// Test that even with CH features enabled, there is no header.
96
- std::vector<base::test::FeatureRef > enabled_features;
99
+ std::vector<base::test::FeatureRefAndParams > enabled_features;
97
100
std::vector<base::test::FeatureRef> disabled_features;
98
101
for (const auto & feature : kTestFeatures ) {
99
102
if (IsClientHintHeaderEnabled ()) {
100
- enabled_features.push_back (feature.get ());
103
+ enabled_features.emplace_back (feature.get (), base::FieldTrialParams ());
101
104
} else {
102
105
disabled_features.push_back (feature.get ());
103
106
}
104
107
}
105
108
106
109
if (IsBraveClientHintFeatureEnabled ()) {
107
- enabled_features.push_back (blink::features::kAllowCertainClientHints );
110
+ enabled_features.emplace_back (blink::features::kAllowCertainClientHints ,
111
+ base::FieldTrialParams ());
112
+ base::FieldTrialParams parameters;
113
+ parameters[blink::features::kClampPlatformVersionClientHintPatchValue
114
+ .name ] = kPlatformVersionClientHintPatchValue ;
115
+ enabled_features.emplace_back (
116
+ blink::features::kClampPlatformVersionClientHint , parameters);
108
117
} else {
109
118
disabled_features.push_back (blink::features::kAllowCertainClientHints );
110
119
}
111
120
112
- scoped_feature_list_.InitWithFeatures (enabled_features, disabled_features);
121
+ scoped_feature_list_.InitWithFeaturesAndParameters (enabled_features,
122
+ disabled_features);
113
123
114
124
if (IsBraveClientHintFeatureEnabled ()) {
115
125
PopulateDefaultClientHints ();
@@ -154,28 +164,39 @@ class ClientHintsBrowserTest
154
164
return unexpected_client_hints_headers_seen_.size ();
155
165
}
156
166
157
- std::string default_client_hints_headers_seen () {
167
+ std::string default_client_hints_headers_seen () const {
158
168
return base::JoinString (
159
169
std::vector<std::string>(default_client_hints_headers_seen_.begin (),
160
170
default_client_hints_headers_seen_.end ()),
161
171
" , " );
162
172
}
163
173
164
- std::string allowed_client_hints_headers_seen () {
174
+ std::string allowed_client_hints_headers_seen () const {
165
175
return base::JoinString (
166
176
std::vector<std::string>(allowed_client_hints_headers_seen_.begin (),
167
177
allowed_client_hints_headers_seen_.end ()),
168
178
" , " );
169
179
}
170
180
171
- std::string unexpected_client_hints_headers_seen () {
181
+ std::string unexpected_client_hints_headers_seen () const {
172
182
return base::JoinString (unexpected_client_hints_headers_seen_, " , " );
173
183
}
174
184
185
+ std::string platform_version_client_hint_value () const {
186
+ return platform_version_client_hint_value_;
187
+ }
188
+
175
189
void reset_client_hints_headers_seen () {
176
190
default_client_hints_headers_seen_.clear ();
177
191
allowed_client_hints_headers_seen_.clear ();
178
192
unexpected_client_hints_headers_seen_.clear ();
193
+ platform_version_client_hint_value_ = " " ;
194
+ }
195
+
196
+ bool VerifyPlatformVersionClientHintPatchValue () const {
197
+ return base::EndsWith (
198
+ platform_version_client_hint_value_,
199
+ base::StrCat ({" ." , kPlatformVersionClientHintPatchValue , " \" " }));
179
200
}
180
201
181
202
private:
@@ -197,6 +218,21 @@ class ClientHintsBrowserTest
197
218
hints_map.at (network::mojom::WebClientHintsType::kUAPlatformVersion ));
198
219
}
199
220
221
+ bool IsPlatformVersionClientHintHeader (const std::string& header) const {
222
+ return header ==
223
+ network::GetClientHintToNameMap ().at (
224
+ network::mojom::WebClientHintsType::kUAPlatformVersion );
225
+ }
226
+
227
+ void StorePlatformVersionClientHintHeaderValue (
228
+ const net::test_server::HttpRequest::HeaderMap& headers) {
229
+ const auto & hints_map = network::GetClientHintToNameMap ();
230
+ const std::string& platform_version_header_name =
231
+ hints_map.at (network::mojom::WebClientHintsType::kUAPlatformVersion );
232
+ platform_version_client_hint_value_ =
233
+ headers.at (platform_version_header_name);
234
+ }
235
+
200
236
void MonitorResourceRequest (const net::test_server::HttpRequest& request) {
201
237
for (const auto & elem : network::GetClientHintToNameMap ()) {
202
238
const auto & header = elem.second ;
@@ -207,6 +243,9 @@ class ClientHintsBrowserTest
207
243
continue ;
208
244
} else if (base::Contains (allowed_hints_, header)) {
209
245
allowed_client_hints_headers_seen_.insert (header);
246
+ if (IsPlatformVersionClientHintHeader (header)) {
247
+ StorePlatformVersionClientHintHeaderValue (request.headers );
248
+ }
210
249
continue ;
211
250
}
212
251
}
@@ -230,10 +269,12 @@ class ClientHintsBrowserTest
230
269
std::vector<std::string> default_hints_;
231
270
std::vector<std::string> allowed_hints_;
232
271
272
+ std::string platform_version_client_hint_value_;
273
+
233
274
base::test::ScopedFeatureList scoped_feature_list_;
234
275
};
235
276
236
- IN_PROC_BROWSER_TEST_P (ClientHintsBrowserTest, ClientHintsDisabled ) {
277
+ IN_PROC_BROWSER_TEST_P (ClientHintsBrowserTest, CheckClientHints ) {
237
278
for (const auto & feature : kTestFeatures ) {
238
279
EXPECT_EQ (IsClientHintHeaderEnabled (),
239
280
base::FeatureList::IsEnabled (feature));
@@ -269,6 +310,13 @@ IN_PROC_BROWSER_TEST_P(ClientHintsBrowserTest, ClientHintsDisabled) {
269
310
<< " Allowed headers seen: " << allowed_client_hints_headers_seen ();
270
311
EXPECT_EQ (0u , client_hints_headers_seen_count ())
271
312
<< " Unexpected headers: " << unexpected_client_hints_headers_seen ();
313
+ if (IsClientHintHeaderEnabled () && IsBraveClientHintFeatureEnabled ()) {
314
+ EXPECT_TRUE (VerifyPlatformVersionClientHintPatchValue ())
315
+ << " Expected the patch field value to be: '"
316
+ << kPlatformVersionClientHintPatchValue << " '. "
317
+ << " Actual platform version value: "
318
+ << platform_version_client_hint_value ();
319
+ }
272
320
273
321
reset_client_hints_headers_seen ();
274
322
ASSERT_TRUE (ui_test_utils::NavigateToURL (
0 commit comments