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