OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/extensions/activity_log/activity_actions.h" | 5 #include "chrome/browser/extensions/activity_log/activity_actions.h" |
6 | 6 |
7 #include <algorithm> // for std::find. | 7 #include <algorithm> // for std::find. |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 Action::InjectionType Action::DidInjectAd( | 154 Action::InjectionType Action::DidInjectAd( |
155 rappor::RapporService* rappor_service) const { | 155 rappor::RapporService* rappor_service) const { |
156 MaybeUploadUrl(rappor_service); | 156 MaybeUploadUrl(rappor_service); |
157 | 157 |
158 // Currently, we do not have the list of ad networks, so we exit immediately | 158 // Currently, we do not have the list of ad networks, so we exit immediately |
159 // with NO_AD_INJECTION (unless the database has been set by a test). | 159 // with NO_AD_INJECTION (unless the database has been set by a test). |
160 if (!AdNetworkDatabase::Get()) | 160 if (!AdNetworkDatabase::Get()) |
161 return NO_AD_INJECTION; | 161 return NO_AD_INJECTION; |
162 | 162 |
163 if (api_name_ == ad_injection_constants::kHtmlIframeSrcApiName || | 163 if (api_name_ == ad_injection_constants::kHtmlIframeSrcApiName || |
164 api_name_ == ad_injection_constants::kHtmlEmbedSrcApiName) { | 164 api_name_ == ad_injection_constants::kHtmlEmbedSrcApiName || |
| 165 api_name_ == ad_injection_constants::kHtmlAnchorHrefApiName) { |
165 return CheckSrcModification(); | 166 return CheckSrcModification(); |
166 } else if (EndsWith(api_name_, | 167 } else if (EndsWith(api_name_, |
167 ad_injection_constants::kAppendChildApiSuffix, | 168 ad_injection_constants::kAppendChildApiSuffix, |
168 true /* case senstive */)) { | 169 true /* case senstive */)) { |
169 return CheckAppendChild(); | 170 return CheckAppendChild(); |
170 } | 171 } |
171 | 172 |
172 return NO_AD_INJECTION; | 173 return NO_AD_INJECTION; |
173 } | 174 } |
174 | 175 |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 if (!can_inject_ads) | 412 if (!can_inject_ads) |
412 return; | 413 return; |
413 | 414 |
414 // Record the URL - an ad *may* have been injected. | 415 // Record the URL - an ad *may* have been injected. |
415 rappor_service->RecordSample(kExtensionAdInjectionRapporMetricName, | 416 rappor_service->RecordSample(kExtensionAdInjectionRapporMetricName, |
416 rappor::ETLD_PLUS_ONE_RAPPOR_TYPE, | 417 rappor::ETLD_PLUS_ONE_RAPPOR_TYPE, |
417 host); | 418 host); |
418 } | 419 } |
419 | 420 |
420 Action::InjectionType Action::CheckSrcModification() const { | 421 Action::InjectionType Action::CheckSrcModification() const { |
421 bool injected_ad = arg_url_.is_valid() && | 422 const AdNetworkDatabase* database = AdNetworkDatabase::Get(); |
422 !arg_url_.is_empty() && | 423 |
423 AdNetworkDatabase::Get()->IsAdNetwork(arg_url_); | 424 bool arg_url_valid = arg_url_.is_valid() && !arg_url_.is_empty(); |
424 return injected_ad ? INJECTION_NEW_AD : NO_AD_INJECTION; | 425 |
| 426 GURL prev_url; |
| 427 std::string prev_url_string; |
| 428 if (args_.get() && args_->GetString(1u, &prev_url_string)) |
| 429 prev_url = GURL(prev_url_string); |
| 430 |
| 431 bool prev_url_valid = prev_url.is_valid() && !prev_url.is_empty(); |
| 432 |
| 433 bool injected_ad = arg_url_valid && database->IsAdNetwork(arg_url_); |
| 434 bool replaced_ad = prev_url_valid && database->IsAdNetwork(prev_url); |
| 435 |
| 436 if (injected_ad && replaced_ad) |
| 437 return INJECTION_REPLACED_AD; |
| 438 if (injected_ad) |
| 439 return INJECTION_NEW_AD; |
| 440 if (replaced_ad) |
| 441 return INJECTION_REMOVED_AD; |
| 442 |
| 443 // If the extension replaced a valid URL with another valid URL for an iframe, |
| 444 // embed, href, etc, then chances are it's ad injection (as there are few |
| 445 // legitimate use cases for this). Log it as a likely one, which also helps |
| 446 // us determine the effectiveness of our IsAdNetwork() recognition. |
| 447 if (arg_url_valid && prev_url_valid) |
| 448 return INJECTION_LIKELY_REPLACED_AD; |
| 449 |
| 450 return NO_AD_INJECTION; |
425 } | 451 } |
426 | 452 |
427 Action::InjectionType Action::CheckAppendChild() const { | 453 Action::InjectionType Action::CheckAppendChild() const { |
428 const base::DictionaryValue* child = NULL; | 454 const base::DictionaryValue* child = NULL; |
429 if (!args_->GetDictionary(0u, &child)) | 455 if (!args_->GetDictionary(0u, &child)) |
430 return NO_AD_INJECTION; | 456 return NO_AD_INJECTION; |
431 | 457 |
432 return CheckDomObject(child); | 458 return CheckDomObject(child); |
433 } | 459 } |
434 | 460 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 std::string rhs_other = ActivityLogPolicy::Util::Serialize(rhs->other()); | 516 std::string rhs_other = ActivityLogPolicy::Util::Serialize(rhs->other()); |
491 if (lhs_other != rhs_other) | 517 if (lhs_other != rhs_other) |
492 return lhs_other < rhs_other; | 518 return lhs_other < rhs_other; |
493 } | 519 } |
494 | 520 |
495 // All fields compare as equal if this point is reached. | 521 // All fields compare as equal if this point is reached. |
496 return false; | 522 return false; |
497 } | 523 } |
498 | 524 |
499 } // namespace extensions | 525 } // namespace extensions |
OLD | NEW |