1 // Copyright 2019 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
5 #include "chrome/browser/page_load_metrics/observers/data_use_metrics_observer.h"
6
7 #include "base/metrics/histogram_macros.h"
8 #include "base/metrics/sparse_histogram.h"
9 #include "chrome/browser/data_use_measurement/chrome_data_use_measurement.h"
10 #include "content/public/browser/navigation_handle.h"
11
12 DataUseMetricsObserver::DataUseMetricsObserver() = default;
13
14 DataUseMetricsObserver::~DataUseMetricsObserver() = default;
15
16 page_load_metrics::PageLoadMetricsObserver::ObservePolicy
OnCommit(content::NavigationHandle * navigation_handle,ukm::SourceId source_id)17 DataUseMetricsObserver::OnCommit(content::NavigationHandle* navigation_handle,
18 ukm::SourceId source_id) {
19 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
20 return CONTINUE_OBSERVING;
21 }
22
23 page_load_metrics::PageLoadMetricsObserver::ObservePolicy
ShouldObserveMimeType(const std::string & mime_type) const24 DataUseMetricsObserver::ShouldObserveMimeType(
25 const std::string& mime_type) const {
26 // Observe all MIME types. We still only use actual data usage, so strange
27 // cases (e.g., data:// URLs) will still record the right amount of data
28 // usage.
29 return CONTINUE_OBSERVING;
30 }
31
OnResourceDataUseObserved(content::RenderFrameHost * rfh,const std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> & resources)32 void DataUseMetricsObserver::OnResourceDataUseObserved(
33 content::RenderFrameHost* rfh,
34 const std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr>&
35 resources) {
36 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
37 auto* chrome_data_use_measurement =
38 data_use_measurement::ChromeDataUseMeasurement::GetInstance();
39 if (!chrome_data_use_measurement)
40 return;
41
42 int64_t received_data_length = 0;
43 for (auto const& resource : resources) {
44 received_data_length += resource->delta_bytes;
45 chrome_data_use_measurement->RecordContentTypeMetric(
46 resource->mime_type, resource->is_main_frame_resource,
47 GetDelegate().GetVisibilityTracker().currently_in_foreground(),
48 resource->delta_bytes);
49 }
50 if (!received_data_length)
51 return;
52 chrome_data_use_measurement->ReportUserTrafficDataUse(
53 GetDelegate().GetVisibilityTracker().currently_in_foreground(),
54 received_data_length);
55 }
56