OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/page_load_metrics/observers/subresource_filter_metrics_
observer.h" | 5 #include "chrome/browser/page_load_metrics/observers/subresource_filter_metrics_
observer.h" |
6 | 6 |
| 7 #include <memory> |
| 8 |
7 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
8 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_
test_harness.h" | 10 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_
test_harness.h" |
| 11 #include "components/subresource_filter/content/browser/subresource_filter_obser
ver_manager.h" |
| 12 #include "components/subresource_filter/core/common/activation_decision.h" |
| 13 #include "components/subresource_filter/core/common/activation_level.h" |
| 14 #include "components/subresource_filter/core/common/activation_state.h" |
| 15 #include "content/public/browser/navigation_handle.h" |
| 16 #include "content/public/test/navigation_simulator.h" |
| 17 #include "url/gurl.h" |
9 | 18 |
10 namespace { | 19 namespace { |
11 const char kDefaultTestUrl[] = "https://example.com/"; | 20 const char kDefaultTestUrl[] = "https://example.com/"; |
| 21 const char kDefaultTestUrlWithActivation[] = "https://example-activation.com/"; |
12 } // namespace | 22 } // namespace |
13 | 23 |
14 class SubresourceFilterMetricsObserverTest | 24 class SubresourceFilterMetricsObserverTest |
15 : public page_load_metrics::PageLoadMetricsObserverTestHarness { | 25 : public page_load_metrics::PageLoadMetricsObserverTestHarness { |
16 public: | 26 public: |
| 27 SubresourceFilterMetricsObserverTest() {} |
| 28 ~SubresourceFilterMetricsObserverTest() override {} |
| 29 |
| 30 void SetUp() override { |
| 31 page_load_metrics::PageLoadMetricsObserverTestHarness::SetUp(); |
| 32 subresource_filter::SubresourceFilterObserverManager::CreateForWebContents( |
| 33 web_contents()); |
| 34 observer_manager_ = |
| 35 subresource_filter::SubresourceFilterObserverManager::FromWebContents( |
| 36 web_contents()); |
| 37 } |
| 38 |
17 void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override { | 39 void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override { |
18 tracker->AddObserver(base::MakeUnique<SubresourceFilterMetricsObserver>()); | 40 tracker->AddObserver(base::MakeUnique<SubresourceFilterMetricsObserver>()); |
19 } | 41 } |
20 | 42 |
21 bool AnyMetricsRecorded() { | 43 size_t TotalMetricsRecorded() { |
22 return !histogram_tester() | 44 return histogram_tester() |
23 .GetTotalCountsForPrefix("PageLoad.Clients.SubresourceFilter.") | 45 .GetTotalCountsForPrefix("PageLoad.Clients.SubresourceFilter.") |
24 .empty(); | 46 .size(); |
25 } | 47 } |
26 | 48 |
27 void InitializePageLoadTiming( | 49 void InitializePageLoadTiming( |
28 page_load_metrics::mojom::PageLoadTiming* timing) { | 50 page_load_metrics::mojom::PageLoadTiming* timing) { |
29 page_load_metrics::InitPageLoadTimingForTest(timing); | 51 page_load_metrics::InitPageLoadTimingForTest(timing); |
30 timing->navigation_start = base::Time::FromDoubleT(1); | 52 timing->navigation_start = base::Time::FromDoubleT(1); |
31 timing->parse_timing->parse_start = base::TimeDelta::FromMilliseconds(100); | 53 timing->parse_timing->parse_start = base::TimeDelta::FromMilliseconds(100); |
32 timing->parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(200); | 54 timing->parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(200); |
33 timing->parse_timing->parse_blocked_on_script_load_duration = | 55 timing->parse_timing->parse_blocked_on_script_load_duration = |
34 base::TimeDelta::FromMilliseconds(10); | 56 base::TimeDelta::FromMilliseconds(10); |
35 timing->parse_timing->parse_blocked_on_script_execution_duration = | 57 timing->parse_timing->parse_blocked_on_script_execution_duration = |
36 base::TimeDelta::FromMilliseconds(20); | 58 base::TimeDelta::FromMilliseconds(20); |
37 timing->paint_timing->first_contentful_paint = | 59 timing->paint_timing->first_contentful_paint = |
38 base::TimeDelta::FromMilliseconds(300); | 60 base::TimeDelta::FromMilliseconds(300); |
39 timing->paint_timing->first_meaningful_paint = | 61 timing->paint_timing->first_meaningful_paint = |
40 base::TimeDelta::FromMilliseconds(400); | 62 base::TimeDelta::FromMilliseconds(400); |
41 timing->document_timing->dom_content_loaded_event_start = | 63 timing->document_timing->dom_content_loaded_event_start = |
42 base::TimeDelta::FromMilliseconds(1200); | 64 base::TimeDelta::FromMilliseconds(1200); |
43 timing->document_timing->load_event_start = | 65 timing->document_timing->load_event_start = |
44 base::TimeDelta::FromMilliseconds(1500); | 66 base::TimeDelta::FromMilliseconds(1500); |
45 PopulateRequiredTimingFields(timing); | 67 PopulateRequiredTimingFields(timing); |
46 } | 68 } |
| 69 |
| 70 void SimulateNavigateAndCommit(const GURL& url) { |
| 71 std::unique_ptr<content::NavigationSimulator> simulator = |
| 72 content::NavigationSimulator::CreateRendererInitiated(url, main_rfh()); |
| 73 simulator->Start(); |
| 74 // Simulate an activation notification. |
| 75 content::NavigationHandle* handle = simulator->GetNavigationHandle(); |
| 76 if (handle->GetURL() == kDefaultTestUrlWithActivation) { |
| 77 observer_manager_->NotifyPageActivationComputed( |
| 78 handle, subresource_filter::ActivationDecision::ACTIVATED, |
| 79 subresource_filter::ActivationState( |
| 80 subresource_filter::ActivationLevel::ENABLED)); |
| 81 } else { |
| 82 observer_manager_->NotifyPageActivationComputed( |
| 83 handle, |
| 84 subresource_filter::ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
| 85 subresource_filter::ActivationState( |
| 86 subresource_filter::ActivationLevel::DISABLED)); |
| 87 } |
| 88 simulator->Commit(); |
| 89 } |
| 90 |
| 91 private: |
| 92 // Owned by the WebContents. |
| 93 subresource_filter::SubresourceFilterObserverManager* observer_manager_ = |
| 94 nullptr; |
| 95 |
| 96 DISALLOW_COPY_AND_ASSIGN(SubresourceFilterMetricsObserverTest); |
47 }; | 97 }; |
48 | 98 |
49 TEST_F(SubresourceFilterMetricsObserverTest, | 99 TEST_F(SubresourceFilterMetricsObserverTest, |
50 NoMetricsForNonSubresourceFilteredNavigation) { | 100 NoMetricsForNonSubresourceFilteredNavigation) { |
51 NavigateAndCommit(GURL(kDefaultTestUrl)); | 101 SimulateNavigateAndCommit(GURL(kDefaultTestUrl)); |
52 | 102 |
53 page_load_metrics::mojom::PageLoadTiming timing; | 103 page_load_metrics::mojom::PageLoadTiming timing; |
54 InitializePageLoadTiming(&timing); | 104 InitializePageLoadTiming(&timing); |
55 SimulateTimingUpdate(timing); | 105 SimulateTimingUpdate(timing); |
56 | 106 |
57 // Navigate away from the current page to force logging of request and byte | 107 // Navigate away from the current page to force logging of request and byte |
58 // metrics. | 108 // metrics. |
59 NavigateToUntrackedUrl(); | 109 NavigateToUntrackedUrl(); |
60 | 110 |
61 ASSERT_FALSE(AnyMetricsRecorded()); | 111 EXPECT_EQ(1u, TotalMetricsRecorded()); |
| 112 histogram_tester().ExpectBucketCount( |
| 113 internal::kHistogramSubresourceFilterActivationDecision, |
| 114 static_cast<int>(subresource_filter::ActivationDecision:: |
| 115 ACTIVATION_CONDITIONS_NOT_MET), |
| 116 1); |
62 } | 117 } |
63 | 118 |
64 TEST_F(SubresourceFilterMetricsObserverTest, Basic) { | 119 TEST_F(SubresourceFilterMetricsObserverTest, Basic) { |
65 NavigateAndCommit(GURL(kDefaultTestUrl)); | 120 SimulateNavigateAndCommit(GURL(kDefaultTestUrlWithActivation)); |
66 | 121 |
67 page_load_metrics::mojom::PageLoadTiming timing; | 122 page_load_metrics::mojom::PageLoadTiming timing; |
68 InitializePageLoadTiming(&timing); | 123 InitializePageLoadTiming(&timing); |
69 page_load_metrics::mojom::PageLoadMetadata metadata; | 124 page_load_metrics::mojom::PageLoadMetadata metadata; |
70 metadata.behavior_flags |= | 125 metadata.behavior_flags |= |
71 blink::WebLoadingBehaviorFlag::kWebLoadingBehaviorSubresourceFilterMatch; | 126 blink::WebLoadingBehaviorFlag::kWebLoadingBehaviorSubresourceFilterMatch; |
72 SimulateTimingAndMetadataUpdate(timing, metadata); | 127 SimulateTimingAndMetadataUpdate(timing, metadata); |
73 | 128 |
74 // Navigate away from the current page to force logging of metrics. | 129 // Navigate away from the current page to force logging of metrics. |
75 NavigateToUntrackedUrl(); | 130 NavigateToUntrackedUrl(); |
76 | 131 |
77 ASSERT_TRUE(AnyMetricsRecorded()); | 132 EXPECT_GT(TotalMetricsRecorded(), 0u); |
78 | 133 |
79 histogram_tester().ExpectTotalCount( | 134 histogram_tester().ExpectTotalCount( |
80 internal::kHistogramSubresourceFilterCount, 1); | 135 internal::kHistogramSubresourceFilterCount, 1); |
81 | 136 |
82 histogram_tester().ExpectTotalCount( | 137 histogram_tester().ExpectTotalCount( |
83 internal::kHistogramSubresourceFilterFirstContentfulPaint, 1); | 138 internal::kHistogramSubresourceFilterFirstContentfulPaint, 1); |
84 histogram_tester().ExpectBucketCount( | 139 histogram_tester().ExpectBucketCount( |
85 internal::kHistogramSubresourceFilterFirstContentfulPaint, | 140 internal::kHistogramSubresourceFilterFirstContentfulPaint, |
86 timing.paint_timing->first_contentful_paint.value().InMilliseconds(), 1); | 141 timing.paint_timing->first_contentful_paint.value().InMilliseconds(), 1); |
87 | 142 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 internal::kHistogramSubresourceFilterParseBlockedOnScriptExecution, | 201 internal::kHistogramSubresourceFilterParseBlockedOnScriptExecution, |
147 timing.parse_timing->parse_blocked_on_script_execution_duration.value() | 202 timing.parse_timing->parse_blocked_on_script_execution_duration.value() |
148 .InMilliseconds(), | 203 .InMilliseconds(), |
149 1); | 204 1); |
150 | 205 |
151 histogram_tester().ExpectTotalCount( | 206 histogram_tester().ExpectTotalCount( |
152 internal::kHistogramSubresourceFilterForegroundDuration, 1); | 207 internal::kHistogramSubresourceFilterForegroundDuration, 1); |
153 } | 208 } |
154 | 209 |
155 TEST_F(SubresourceFilterMetricsObserverTest, Subresources) { | 210 TEST_F(SubresourceFilterMetricsObserverTest, Subresources) { |
156 NavigateAndCommit(GURL(kDefaultTestUrl)); | 211 SimulateNavigateAndCommit(GURL(kDefaultTestUrlWithActivation)); |
157 | 212 |
158 SimulateLoadedResource( | 213 SimulateLoadedResource( |
159 {GURL(), -1 /* frame_tree_node_id */, false /* was_cached */, | 214 {GURL(), -1 /* frame_tree_node_id */, false /* was_cached */, |
160 1024 * 40 /* raw_body_bytes */, 0 /* original_network_content_length */, | 215 1024 * 40 /* raw_body_bytes */, 0 /* original_network_content_length */, |
161 nullptr /* data_reduction_proxy_data */, | 216 nullptr /* data_reduction_proxy_data */, |
162 content::ResourceType::RESOURCE_TYPE_MAIN_FRAME}); | 217 content::ResourceType::RESOURCE_TYPE_MAIN_FRAME}); |
163 | 218 |
164 page_load_metrics::mojom::PageLoadTiming timing; | 219 page_load_metrics::mojom::PageLoadTiming timing; |
165 page_load_metrics::InitPageLoadTimingForTest(&timing); | 220 page_load_metrics::InitPageLoadTimingForTest(&timing); |
166 timing.navigation_start = base::Time::FromDoubleT(1); | 221 timing.navigation_start = base::Time::FromDoubleT(1); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 histogram_tester().ExpectBucketCount( | 299 histogram_tester().ExpectBucketCount( |
245 internal::kHistogramSubresourceFilterNoMediaNetworkBytes, 60, 1); | 300 internal::kHistogramSubresourceFilterNoMediaNetworkBytes, 60, 1); |
246 | 301 |
247 histogram_tester().ExpectTotalCount( | 302 histogram_tester().ExpectTotalCount( |
248 internal::kHistogramSubresourceFilterNoMediaCacheBytes, 1); | 303 internal::kHistogramSubresourceFilterNoMediaCacheBytes, 1); |
249 histogram_tester().ExpectBucketCount( | 304 histogram_tester().ExpectBucketCount( |
250 internal::kHistogramSubresourceFilterNoMediaCacheBytes, 10, 1); | 305 internal::kHistogramSubresourceFilterNoMediaCacheBytes, 10, 1); |
251 } | 306 } |
252 | 307 |
253 TEST_F(SubresourceFilterMetricsObserverTest, SubresourcesWithMedia) { | 308 TEST_F(SubresourceFilterMetricsObserverTest, SubresourcesWithMedia) { |
254 NavigateAndCommit(GURL(kDefaultTestUrl)); | 309 SimulateNavigateAndCommit(GURL(kDefaultTestUrlWithActivation)); |
255 | 310 |
256 SimulateMediaPlayed(); | 311 SimulateMediaPlayed(); |
257 | 312 |
258 SimulateLoadedResource( | 313 SimulateLoadedResource( |
259 {GURL(), -1 /* frame_tree_node_id */, false /* was_cached */, | 314 {GURL(), -1 /* frame_tree_node_id */, false /* was_cached */, |
260 1024 * 40 /* raw_body_bytes */, 0 /* original_network_content_length */, | 315 1024 * 40 /* raw_body_bytes */, 0 /* original_network_content_length */, |
261 nullptr /* data_reduction_proxy_data */, | 316 nullptr /* data_reduction_proxy_data */, |
262 content::ResourceType::RESOURCE_TYPE_MAIN_FRAME}); | 317 content::ResourceType::RESOURCE_TYPE_MAIN_FRAME}); |
263 | 318 |
264 page_load_metrics::mojom::PageLoadTiming timing; | 319 page_load_metrics::mojom::PageLoadTiming timing; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 histogram_tester().ExpectTotalCount( | 397 histogram_tester().ExpectTotalCount( |
343 internal::kHistogramSubresourceFilterMediaNetworkBytes, 1); | 398 internal::kHistogramSubresourceFilterMediaNetworkBytes, 1); |
344 histogram_tester().ExpectBucketCount( | 399 histogram_tester().ExpectBucketCount( |
345 internal::kHistogramSubresourceFilterMediaNetworkBytes, 60, 1); | 400 internal::kHistogramSubresourceFilterMediaNetworkBytes, 60, 1); |
346 | 401 |
347 histogram_tester().ExpectTotalCount( | 402 histogram_tester().ExpectTotalCount( |
348 internal::kHistogramSubresourceFilterMediaCacheBytes, 1); | 403 internal::kHistogramSubresourceFilterMediaCacheBytes, 1); |
349 histogram_tester().ExpectBucketCount( | 404 histogram_tester().ExpectBucketCount( |
350 internal::kHistogramSubresourceFilterMediaCacheBytes, 10, 1); | 405 internal::kHistogramSubresourceFilterMediaCacheBytes, 10, 1); |
351 } | 406 } |
OLD | NEW |