Skip to content

Commit 55e0899

Browse files
Giovanni Ortuño UrquidiChromium LUCI CQ
authored andcommitted
LNA: Add use counters for WebRTC LNA
Add per page-load metrics for Local Network Access. This will help us understand how often the LNA permission prompt will be shown. Bug: 421223919 Change-Id: I6176447afd357ec286b53d228fe97328baa5b5a0 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7042843 Reviewed-by: Guido Urdaneta <[email protected]> Commit-Queue: Giovanni Ortuno Urquidi <[email protected]> Reviewed-by: Harald Alvestrand <[email protected]> Cr-Commit-Position: refs/heads/main@{#1532382}
1 parent 82f5dc1 commit 55e0899

File tree

5 files changed

+87
-6
lines changed

5 files changed

+87
-6
lines changed

third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5016,6 +5016,10 @@ enum WebFeature {
50165016
kTestReportBodyToJSON = 5701,
50175017
kSpeculationRulesPrerenderUntilScript = 5702,
50185018
kClipboardChangeEventChangeIdAttribute = 5703,
5019+
kWebRTCLocalNetworkAccessCheck = 5704,
5020+
kWebRTCLocalNetworkAccessPublicToLocal = 5705,
5021+
kWebRTCLocalNetworkAccessPublicToLoopback = 5706,
5022+
kWebRTCLocalNetworkAccessLocalToLoopback = 5707,
50195023

50205024
// Add new features immediately above this line. Don't change assigned
50215025
// numbers of any item, and don't reuse removed slots. Also don't add extra

third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
#include "third_party/blink/renderer/platform/peerconnection/vsync_provider.h"
8686
#include "third_party/blink/renderer/platform/peerconnection/vsync_tick_provider.h"
8787
#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
88+
#include "third_party/blink/renderer/platform/wtf/bind_post_task.h"
8889
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h"
8990
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_gfx.h"
9091
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_mojo.h"
@@ -242,9 +243,12 @@ class LocalNetworkAccessPermission final
242243
public:
243244
explicit LocalNetworkAccessPermission(
244245
network::mojom::IPAddressSpace originator_address_space,
245-
mojo::Remote<mojom::blink::PermissionService> permission_service)
246+
mojo::Remote<mojom::blink::PermissionService> permission_service,
247+
blink::CrossThreadRepeatingFunction<void(LocalNetworkAccessRequestType)>
248+
count_callback)
246249
: originator_address_space_(originator_address_space),
247-
permission_service_(std::move(permission_service)) {}
250+
permission_service_(std::move(permission_service)),
251+
count_callback_(std::move(count_callback)) {}
248252

249253
~LocalNetworkAccessPermission() override {
250254
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -255,10 +259,11 @@ class LocalNetworkAccessPermission final
255259
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
256260

257261
const auto target_address_space = FromSocketAddress(candidate_address);
262+
auto request_type = GetLocalNetworkAccessRequestType(
263+
originator_address_space_, target_address_space);
258264
base::UmaHistogramEnumeration(
259-
"WebRTC.PeerConnection.LocalNetworkAccess.RequestType",
260-
GetLocalNetworkAccessRequestType(originator_address_space_,
261-
target_address_space));
265+
"WebRTC.PeerConnection.LocalNetworkAccess.RequestType", request_type);
266+
count_callback_.Run(request_type);
262267

263268
if (!RuntimeEnabledFeatures::LocalNetworkAccessWebRTCEnabled()) {
264269
return false;
@@ -312,6 +317,8 @@ class LocalNetworkAccessPermission final
312317
callback_;
313318
const network::mojom::IPAddressSpace originator_address_space_;
314319
mojo::Remote<mojom::blink::PermissionService> permission_service_;
320+
blink::CrossThreadRepeatingFunction<void(LocalNetworkAccessRequestType)>
321+
count_callback_;
315322

316323
THREAD_CHECKER(thread_checker_);
317324

@@ -342,7 +349,12 @@ class LocalNetworkAccessPermissionFactory final
342349
permission_service.BindNewPipeAndPassReceiver()));
343350

344351
return std::make_unique<LocalNetworkAccessPermission>(
345-
originator_address_space_, std::move(permission_service));
352+
originator_address_space_, std::move(permission_service),
353+
blink::BindPostTask(
354+
main_thread_task_runner_,
355+
CrossThreadBindRepeating(
356+
&PeerConnectionDependencyFactory::CountLocalNetworkAccess,
357+
MakeUnwrappingCrossThreadWeakHandle(factory_))));
346358
}
347359

348360
private:
@@ -1323,4 +1335,38 @@ PeerConnectionDependencyFactory::
13231335
return std::make_unique<LocalNetworkAccessPermissionFactory>(this);
13241336
}
13251337

1338+
void PeerConnectionDependencyFactory::CountLocalNetworkAccess(
1339+
LocalNetworkAccessRequestType request_type) {
1340+
UseCounter::Count(DomWindow(),
1341+
mojom::blink::WebFeature::kWebRTCLocalNetworkAccessCheck);
1342+
1343+
switch (request_type) {
1344+
// To same or more public cases:
1345+
case LocalNetworkAccessRequestType::kUnknown:
1346+
case LocalNetworkAccessRequestType::kPublicToPublic:
1347+
case LocalNetworkAccessRequestType::kLocalToPublic:
1348+
case LocalNetworkAccessRequestType::kLocalToLocal:
1349+
case LocalNetworkAccessRequestType::kLoopbackToPublic:
1350+
case LocalNetworkAccessRequestType::kLoopbackToLocal:
1351+
case LocalNetworkAccessRequestType::kLoopbackToLoopback:
1352+
return;
1353+
// To less public cases:
1354+
case LocalNetworkAccessRequestType::kPublicToLocal:
1355+
UseCounter::Count(
1356+
DomWindow(),
1357+
mojom::blink::WebFeature::kWebRTCLocalNetworkAccessPublicToLocal);
1358+
return;
1359+
case LocalNetworkAccessRequestType::kPublicToLoopback:
1360+
UseCounter::Count(
1361+
DomWindow(),
1362+
mojom::blink::WebFeature::kWebRTCLocalNetworkAccessPublicToLoopback);
1363+
return;
1364+
case LocalNetworkAccessRequestType::kLocalToLoopback:
1365+
UseCounter::Count(
1366+
DomWindow(),
1367+
mojom::blink::WebFeature::kWebRTCLocalNetworkAccessLocalToLoopback);
1368+
return;
1369+
}
1370+
}
1371+
13261372
} // namespace blink

third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class MODULES_EXPORT PeerConnectionDependencyFactory
173173
void BindPermissionService(
174174
mojo::PendingReceiver<mojom::blink::PermissionService>
175175
permission_service);
176+
void CountLocalNetworkAccess(LocalNetworkAccessRequestType);
176177

177178
std::unique_ptr<webrtc::LocalNetworkAccessPermissionFactoryInterface>
178179
CreateLocalNetworkAccessPermissionFactoryForTesting();

third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory_test.cc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "base/notreached.h"
1010
#include "base/strings/strcat.h"
1111
#include "base/strings/to_string.h"
12+
#include "base/task/current_thread.h"
1213
#include "base/test/metrics/histogram_tester.h"
1314
#include "base/test/scoped_feature_list.h"
1415
#include "mojo/public/cpp/bindings/pending_associated_remote.h"
@@ -18,7 +19,9 @@
1819
#include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
1920
#include "third_party/blink/public/platform/web_runtime_features.h"
2021
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
22+
#include "third_party/blink/renderer/core/dom/document.h"
2123
#include "third_party/blink/renderer/core/frame/policy_container.h"
24+
#include "third_party/blink/renderer/core/frame/web_feature.h"
2225
#include "third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.h"
2326
#include "third_party/blink/renderer/modules/peerconnection/mock_rtc_peer_connection_handler_client.h"
2427
#include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h"
@@ -114,6 +117,27 @@ class LocalNetworkAccessPeerConnectionDependencyFactoryTest
114117
}
115118

116119
protected:
120+
void TestUseCounters(Document& document,
121+
LocalNetworkAccessRequestType request_type) {
122+
base::test::RunUntil([&]() {
123+
return document.IsUseCounted(
124+
mojom::blink::WebFeature::kWebRTCLocalNetworkAccessCheck);
125+
});
126+
127+
EXPECT_EQ(
128+
request_type == LocalNetworkAccessRequestType::kPublicToLocal,
129+
document.IsUseCounted(
130+
mojom::blink::WebFeature::kWebRTCLocalNetworkAccessPublicToLocal));
131+
EXPECT_EQ(
132+
request_type == LocalNetworkAccessRequestType::kPublicToLoopback,
133+
document.IsUseCounted(mojom::blink::WebFeature::
134+
kWebRTCLocalNetworkAccessPublicToLoopback));
135+
EXPECT_EQ(
136+
request_type == LocalNetworkAccessRequestType::kLocalToLoopback,
137+
document.IsUseCounted(mojom::blink::WebFeature::
138+
kWebRTCLocalNetworkAccessLocalToLoopback));
139+
}
140+
117141
base::test::ScopedFeatureList feature_list_;
118142
base::HistogramTester histogram_tester_;
119143
};
@@ -225,6 +249,7 @@ TEST_P(LocalNetworkAccessPeerConnectionDependencyFactoryTest,
225249

226250
histogram_tester_.ExpectUniqueSample(
227251
"WebRTC.PeerConnection.LocalNetworkAccess.RequestType", request_type, 1);
252+
TestUseCounters(scope.GetDocument(), request_type);
228253
}
229254

230255
TEST_P(LocalNetworkAccessPeerConnectionDependencyFactoryTest,
@@ -255,6 +280,7 @@ TEST_P(LocalNetworkAccessPeerConnectionDependencyFactoryTest,
255280

256281
histogram_tester_.ExpectUniqueSample(
257282
"WebRTC.PeerConnection.LocalNetworkAccess.RequestType", request_type, 1);
283+
TestUseCounters(scope.GetDocument(), request_type);
258284
}
259285

260286
} // namespace blink

tools/metrics/histograms/metadata/blink/enums.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6333,6 +6333,10 @@ Called by update_use_counter_feature_enum.py.-->
63336333
<int value="5701" label="TestReportBodyToJSON"/>
63346334
<int value="5702" label="SpeculationRulesPrerenderUntilScript"/>
63356335
<int value="5703" label="ClipboardChangeEventChangeIdAttribute"/>
6336+
<int value="5704" label="WebRTCLocalNetworkAccessCheck"/>
6337+
<int value="5705" label="WebRTCLocalNetworkAccessPublicToLocal"/>
6338+
<int value="5706" label="WebRTCLocalNetworkAccessPublicToLoopback"/>
6339+
<int value="5707" label="WebRTCLocalNetworkAccessLocalToLoopback"/>
63366340
</enum>
63376341

63386342
<!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom:WebFeature) -->

0 commit comments

Comments
 (0)