OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/subresource_filter/content/browser/content_subresource_filt
er_driver_factory.h" | 5 #include "components/subresource_filter/content/browser/content_subresource_filt
er_driver_factory.h" |
6 | 6 |
7 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
10 #include "components/subresource_filter/content/browser/subresource_filter_clien
t.h" | 10 #include "components/subresource_filter/content/browser/subresource_filter_clien
t.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 url == referrer.url; | 72 url == referrer.url; |
73 } | 73 } |
74 | 74 |
75 ContentSubresourceFilterDriverFactory::ContentSubresourceFilterDriverFactory( | 75 ContentSubresourceFilterDriverFactory::ContentSubresourceFilterDriverFactory( |
76 content::WebContents* web_contents, | 76 content::WebContents* web_contents, |
77 std::unique_ptr<SubresourceFilterClient> client) | 77 std::unique_ptr<SubresourceFilterClient> client) |
78 : content::WebContentsObserver(web_contents), | 78 : content::WebContentsObserver(web_contents), |
79 client_(std::move(client)), | 79 client_(std::move(client)), |
80 activation_level_(ActivationLevel::DISABLED), | 80 activation_level_(ActivationLevel::DISABLED), |
81 activation_decision_(ActivationDecision::UNKNOWN), | 81 activation_decision_(ActivationDecision::UNKNOWN), |
82 measure_performance_(false) {} | 82 measure_performance_(false), |
| 83 subresource_filter_only_hit_(false) {} |
83 | 84 |
84 ContentSubresourceFilterDriverFactory:: | 85 ContentSubresourceFilterDriverFactory:: |
85 ~ContentSubresourceFilterDriverFactory() {} | 86 ~ContentSubresourceFilterDriverFactory() {} |
86 | 87 |
87 void ContentSubresourceFilterDriverFactory::OnFirstSubresourceLoadDisallowed() { | 88 void ContentSubresourceFilterDriverFactory::OnFirstSubresourceLoadDisallowed() { |
88 if (ShouldSuppressNotifications()) | 89 if (ShouldSuppressNotifications()) |
89 return; | 90 return; |
90 | 91 |
91 client_->ToggleNotificationVisibility(activation_level_ == | 92 client_->ToggleNotificationVisibility(activation_level_ == |
92 ActivationLevel::ENABLED); | 93 ActivationLevel::ENABLED); |
(...skipping 25 matching lines...) Expand all Loading... |
118 OnMainResourceMatchedSafeBrowsingBlacklist( | 119 OnMainResourceMatchedSafeBrowsingBlacklist( |
119 const GURL& url, | 120 const GURL& url, |
120 const std::vector<GURL>& redirect_urls, | 121 const std::vector<GURL>& redirect_urls, |
121 safe_browsing::SBThreatType threat_type, | 122 safe_browsing::SBThreatType threat_type, |
122 safe_browsing::ThreatPatternType threat_type_metadata) { | 123 safe_browsing::ThreatPatternType threat_type_metadata) { |
123 bool is_phishing_interstitial = | 124 bool is_phishing_interstitial = |
124 (threat_type == safe_browsing::SB_THREAT_TYPE_URL_PHISHING); | 125 (threat_type == safe_browsing::SB_THREAT_TYPE_URL_PHISHING); |
125 bool is_soc_engineering_ads_interstitial = | 126 bool is_soc_engineering_ads_interstitial = |
126 threat_type_metadata == | 127 threat_type_metadata == |
127 safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS; | 128 safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS; |
128 | 129 subresource_filter_only_hit_ = |
| 130 threat_type == safe_browsing::SB_THREAT_TYPE_SUBRESOURCE_FILTER; |
129 if (is_phishing_interstitial) { | 131 if (is_phishing_interstitial) { |
130 if (is_soc_engineering_ads_interstitial) { | 132 if (is_soc_engineering_ads_interstitial) { |
131 AddActivationListMatch(url, ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL); | 133 AddActivationListMatch(url, ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL); |
132 } | 134 } |
133 AddActivationListMatch(url, ActivationList::PHISHING_INTERSTITIAL); | 135 AddActivationListMatch(url, ActivationList::PHISHING_INTERSTITIAL); |
| 136 } else if (subresource_filter_only_hit_) { |
| 137 AddActivationListMatch(url, ActivationList::SUBRESOURCE_FILTER); |
134 } | 138 } |
135 } | 139 } |
136 | 140 |
137 void ContentSubresourceFilterDriverFactory::AddHostOfURLToWhitelistSet( | 141 void ContentSubresourceFilterDriverFactory::AddHostOfURLToWhitelistSet( |
138 const GURL& url) { | 142 const GURL& url) { |
139 if (url.has_host() && url.SchemeIsHTTPOrHTTPS()) | 143 if (url.has_host() && url.SchemeIsHTTPOrHTTPS()) |
140 whitelisted_hosts_.insert(url.host()); | 144 whitelisted_hosts_.insert(url.host()); |
141 } | 145 } |
142 | 146 |
143 ContentSubresourceFilterDriverFactory::ActivationDecision | 147 ContentSubresourceFilterDriverFactory::ActivationDecision |
(...skipping 12 matching lines...) Expand all Loading... |
156 return ActivationDecision::URL_WHITELISTED; | 160 return ActivationDecision::URL_WHITELISTED; |
157 | 161 |
158 switch (scope) { | 162 switch (scope) { |
159 case ActivationScope::ALL_SITES: | 163 case ActivationScope::ALL_SITES: |
160 return ActivationDecision::ACTIVATED; | 164 return ActivationDecision::ACTIVATED; |
161 case ActivationScope::ACTIVATION_LIST: | 165 case ActivationScope::ACTIVATION_LIST: |
162 // The logic to ensure only http/https URLs are activated lives in | 166 // The logic to ensure only http/https URLs are activated lives in |
163 // AddActivationListMatch to ensure the activation list only has relevant | 167 // AddActivationListMatch to ensure the activation list only has relevant |
164 // entries. | 168 // entries. |
165 DCHECK(url.SchemeIsHTTPOrHTTPS() || | 169 DCHECK(url.SchemeIsHTTPOrHTTPS() || |
166 !DidURLMatchCurrentActivationList(url)); | 170 !DidURLMatchActivationList(url, GetCurrentActivationList())); |
167 return DidURLMatchCurrentActivationList(url) | 171 return DidURLMatchActivationList(url, GetCurrentActivationList()) |
168 ? ActivationDecision::ACTIVATED | 172 ? ActivationDecision::ACTIVATED |
169 : ActivationDecision::ACTIVATION_LIST_NOT_MATCHED; | 173 : ActivationDecision::ACTIVATION_LIST_NOT_MATCHED; |
170 default: | 174 default: |
171 return ActivationDecision::ACTIVATION_DISABLED; | 175 return ActivationDecision::ACTIVATION_DISABLED; |
172 } | 176 } |
173 } | 177 } |
174 | 178 |
175 void ContentSubresourceFilterDriverFactory::ActivateForFrameHostIfNeeded( | 179 void ContentSubresourceFilterDriverFactory::ActivateForFrameHostIfNeeded( |
176 content::RenderFrameHost* render_frame_host, | 180 content::RenderFrameHost* render_frame_host, |
177 const GURL& url) { | 181 const GURL& url) { |
(...skipping 21 matching lines...) Expand all Loading... |
199 } | 203 } |
200 | 204 |
201 void ContentSubresourceFilterDriverFactory::DidStartNavigation( | 205 void ContentSubresourceFilterDriverFactory::DidStartNavigation( |
202 content::NavigationHandle* navigation_handle) { | 206 content::NavigationHandle* navigation_handle) { |
203 if (navigation_handle->IsInMainFrame() && | 207 if (navigation_handle->IsInMainFrame() && |
204 !navigation_handle->IsSameDocument()) { | 208 !navigation_handle->IsSameDocument()) { |
205 activation_decision_ = ActivationDecision::UNKNOWN; | 209 activation_decision_ = ActivationDecision::UNKNOWN; |
206 ResetActivationState(); | 210 ResetActivationState(); |
207 navigation_chain_.push_back(navigation_handle->GetURL()); | 211 navigation_chain_.push_back(navigation_handle->GetURL()); |
208 client_->ToggleNotificationVisibility(false); | 212 client_->ToggleNotificationVisibility(false); |
| 213 subresource_filter_only_hit_ = false; |
209 } | 214 } |
210 } | 215 } |
211 | 216 |
212 void ContentSubresourceFilterDriverFactory::DidRedirectNavigation( | 217 void ContentSubresourceFilterDriverFactory::DidRedirectNavigation( |
213 content::NavigationHandle* navigation_handle) { | 218 content::NavigationHandle* navigation_handle) { |
214 DCHECK(!navigation_handle->IsSameDocument()); | 219 DCHECK(!navigation_handle->IsSameDocument()); |
215 if (navigation_handle->IsInMainFrame()) | 220 if (navigation_handle->IsInMainFrame()) |
216 navigation_chain_.push_back(navigation_handle->GetURL()); | 221 navigation_chain_.push_back(navigation_handle->GetURL()); |
217 } | 222 } |
218 | 223 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 ResetActivationState(); | 319 ResetActivationState(); |
315 return; | 320 return; |
316 } | 321 } |
317 | 322 |
318 activation_level_ = GetMaximumActivationLevel(); | 323 activation_level_ = GetMaximumActivationLevel(); |
319 measure_performance_ = activation_level_ != ActivationLevel::DISABLED && | 324 measure_performance_ = activation_level_ != ActivationLevel::DISABLED && |
320 ShouldMeasurePerformanceForPageLoad(); | 325 ShouldMeasurePerformanceForPageLoad(); |
321 ActivateForFrameHostIfNeeded(render_frame_host, url); | 326 ActivateForFrameHostIfNeeded(render_frame_host, url); |
322 } | 327 } |
323 | 328 |
324 bool ContentSubresourceFilterDriverFactory::DidURLMatchCurrentActivationList( | 329 bool ContentSubresourceFilterDriverFactory::DidURLMatchActivationList( |
325 const GURL& url) const { | 330 const GURL& url, |
| 331 ActivationList acttivation_list) const { |
326 auto match_types = | 332 auto match_types = |
327 activation_list_matches_.find(DistillURLToHostAndPath(url)); | 333 activation_list_matches_.find(DistillURLToHostAndPath(url)); |
328 return match_types != activation_list_matches_.end() && | 334 return match_types != activation_list_matches_.end() && |
329 match_types->second.find(GetCurrentActivationList()) != | 335 match_types->second.find(acttivation_list) != |
330 match_types->second.end(); | 336 match_types->second.end(); |
331 } | 337 } |
332 | 338 |
333 void ContentSubresourceFilterDriverFactory::AddActivationListMatch( | 339 void ContentSubresourceFilterDriverFactory::AddActivationListMatch( |
334 const GURL& url, | 340 const GURL& url, |
335 ActivationList match_type) { | 341 ActivationList match_type) { |
336 if (url.has_host() && url.SchemeIsHTTPOrHTTPS()) | 342 if (url.has_host() && url.SchemeIsHTTPOrHTTPS()) |
337 activation_list_matches_[DistillURLToHostAndPath(url)].insert(match_type); | 343 activation_list_matches_[DistillURLToHostAndPath(url)].insert(match_type); |
338 } | 344 } |
339 | 345 |
340 void ContentSubresourceFilterDriverFactory::RecordRedirectChainMatchPattern() | 346 int ContentSubresourceFilterDriverFactory::CalculateHitPatternForActivationList( |
341 const { | 347 ActivationList activation_list) const { |
342 int hits_pattern = 0; | 348 int hits_pattern = 0; |
343 const int kInitialURLHitMask = 0x4; | 349 const int kInitialURLHitMask = 0x4; |
344 const int kRedirectURLHitMask = 0x2; | 350 const int kRedirectURLHitMask = 0x2; |
345 const int kFinalURLHitMask = 0x1; | 351 const int kFinalURLHitMask = 0x1; |
| 352 |
346 if (navigation_chain_.size() > 1) { | 353 if (navigation_chain_.size() > 1) { |
347 if (DidURLMatchCurrentActivationList(navigation_chain_.back())) | 354 if (DidURLMatchActivationList(navigation_chain_.back(), activation_list)) |
348 hits_pattern |= kFinalURLHitMask; | 355 hits_pattern |= kFinalURLHitMask; |
349 if (DidURLMatchCurrentActivationList(navigation_chain_.front())) | 356 if (DidURLMatchActivationList(navigation_chain_.front(), activation_list)) |
350 hits_pattern |= kInitialURLHitMask; | 357 hits_pattern |= kInitialURLHitMask; |
351 | 358 |
352 // Examine redirects. | 359 // Examine redirects. |
353 for (size_t i = 1; i < navigation_chain_.size() - 1; ++i) { | 360 for (size_t i = 1; i < navigation_chain_.size() - 1; ++i) { |
354 if (DidURLMatchCurrentActivationList(navigation_chain_[i])) { | 361 if (DidURLMatchActivationList(navigation_chain_[i], activation_list)) { |
355 hits_pattern |= kRedirectURLHitMask; | 362 hits_pattern |= kRedirectURLHitMask; |
356 break; | 363 break; |
357 } | 364 } |
358 } | 365 } |
359 } else { | 366 } else { |
360 if (navigation_chain_.size() && | 367 if (navigation_chain_.size() && |
361 DidURLMatchCurrentActivationList(navigation_chain_.front())) { | 368 DidURLMatchActivationList(navigation_chain_.front(), activation_list)) { |
362 hits_pattern = 0x8; // One url hit. | 369 hits_pattern = 0x8; // One url hit. |
363 } | 370 } |
364 } | 371 } |
| 372 return hits_pattern; |
| 373 } |
| 374 |
| 375 void ContentSubresourceFilterDriverFactory::RecordRedirectChainMatchPattern() |
| 376 const { |
| 377 int hits_pattern = CalculateHitPatternForActivationList( |
| 378 !subresource_filter_only_hit_ ? GetCurrentActivationList() |
| 379 : ActivationList::SUBRESOURCE_FILTER); |
365 if (!hits_pattern) | 380 if (!hits_pattern) |
366 return; | 381 return; |
367 UMA_HISTOGRAM_ENUMERATION( | 382 if (subresource_filter_only_hit_) { |
368 "SubresourceFilter.PageLoad.RedirectChainMatchPattern", hits_pattern, | 383 UMA_HISTOGRAM_ENUMERATION( |
369 0x10 /* max value */); | 384 "SubresourceFilter.PageLoad.RedirectChainMatchPattern." |
370 UMA_HISTOGRAM_COUNTS("SubresourceFilter.PageLoad.RedirectChainLength", | 385 "SubresourceFilterOnly", |
371 navigation_chain_.size()); | 386 hits_pattern, 0x10 /* max value */); |
| 387 UMA_HISTOGRAM_COUNTS( |
| 388 "SubresourceFilter.PageLoad.RedirectChainLength.SubresourceFilterOnly", |
| 389 navigation_chain_.size()); |
| 390 |
| 391 } else { |
| 392 UMA_HISTOGRAM_ENUMERATION( |
| 393 "SubresourceFilter.PageLoad.RedirectChainMatchPattern", hits_pattern, |
| 394 0x10 /* max value */); |
| 395 UMA_HISTOGRAM_COUNTS("SubresourceFilter.PageLoad.RedirectChainLength", |
| 396 navigation_chain_.size()); |
| 397 }; |
372 } | 398 } |
373 | 399 |
374 } // namespace subresource_filter | 400 } // namespace subresource_filter |
OLD | NEW |