Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(640)

Side by Side Diff: chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc

Issue 2624463003: Address 2 crashes in download attribution code (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager .h" 5 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager .h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/metrics/histogram_macros.h" 8 #include "base/metrics/histogram_macros.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 CleanUpIpAddresses(); 187 CleanUpIpAddresses();
188 ScheduleNextCleanUpAfterInterval( 188 ScheduleNextCleanUpAfterInterval(
189 base::TimeDelta::FromSecondsD(kNavigationFootprintTTLInSecond)); 189 base::TimeDelta::FromSecondsD(kNavigationFootprintTTLInSecond));
190 } 190 }
191 191
192 SafeBrowsingNavigationObserverManager::AttributionResult 192 SafeBrowsingNavigationObserverManager::AttributionResult
193 SafeBrowsingNavigationObserverManager::IdentifyReferrerChainForDownload( 193 SafeBrowsingNavigationObserverManager::IdentifyReferrerChainForDownload(
194 const GURL& target_url, 194 const GURL& target_url,
195 int target_tab_id, 195 int target_tab_id,
196 int user_gesture_count_limit, 196 int user_gesture_count_limit,
197 std::vector<ReferrerChainEntry>* out_referrer_chain) { 197 ReferrerChain* out_referrer_chain) {
198 if (!target_url.is_valid()) 198 if (!target_url.is_valid())
199 return INVALID_URL; 199 return INVALID_URL;
200 200
201 NavigationEvent* nav_event = FindNavigationEvent( 201 NavigationEvent* nav_event = FindNavigationEvent(
202 target_url, 202 target_url,
203 GURL(), 203 GURL(),
204 target_tab_id); 204 target_tab_id);
205 if (!nav_event) { 205 if (!nav_event) {
206 // We cannot find a single navigation event related to this download. 206 // We cannot find a single navigation event related to this download.
207 return NAVIGATION_EVENT_NOT_FOUND; 207 return NAVIGATION_EVENT_NOT_FOUND;
(...skipping 10 matching lines...) Expand all
218 &result); 218 &result);
219 return result; 219 return result;
220 } 220 }
221 221
222 SafeBrowsingNavigationObserverManager::AttributionResult 222 SafeBrowsingNavigationObserverManager::AttributionResult
223 SafeBrowsingNavigationObserverManager::IdentifyReferrerChainForPPAPIDownload( 223 SafeBrowsingNavigationObserverManager::IdentifyReferrerChainForPPAPIDownload(
224 const GURL& initiating_frame_url, 224 const GURL& initiating_frame_url,
225 int tab_id, 225 int tab_id,
226 bool has_user_gesture, 226 bool has_user_gesture,
227 int user_gesture_count_limit, 227 int user_gesture_count_limit,
228 std::vector<ReferrerChainEntry>* out_referrer_chain) { 228 ReferrerChain* out_referrer_chain) {
229 if (!initiating_frame_url.is_valid()) 229 if (!initiating_frame_url.is_valid())
230 return INVALID_URL; 230 return INVALID_URL;
231 231
232 NavigationEvent* nav_event = 232 NavigationEvent* nav_event =
233 FindNavigationEvent(initiating_frame_url, GURL(), tab_id); 233 FindNavigationEvent(initiating_frame_url, GURL(), tab_id);
234 if (!nav_event) { 234 if (!nav_event) {
235 // We cannot find a single navigation event related to this download. 235 // We cannot find a single navigation event related to this download.
236 return NAVIGATION_EVENT_NOT_FOUND; 236 return NAVIGATION_EVENT_NOT_FOUND;
237 } 237 }
238 238
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 GURL search_url = 390 GURL search_url =
391 target_url.is_empty() ? target_main_frame_url : target_url; 391 target_url.is_empty() ? target_main_frame_url : target_url;
392 auto it = navigation_map_.find(search_url); 392 auto it = navigation_map_.find(search_url);
393 if (it == navigation_map_.end()) 393 if (it == navigation_map_.end())
394 return nullptr; 394 return nullptr;
395 395
396 // Since navigation events are recorded in chronological order, we traverse 396 // Since navigation events are recorded in chronological order, we traverse
397 // the vector in reverse order to get the latest match. 397 // the vector in reverse order to get the latest match.
398 for (auto rit = it->second.rbegin(); rit != it->second.rend(); ++rit) { 398 for (auto rit = it->second.rbegin(); rit != it->second.rend(); ++rit) {
399 // If tab id is not valid, we only compare url, otherwise we compare both. 399 // If tab id is not valid, we only compare url, otherwise we compare both.
400 if (rit->destination_url == search_url)
Jialiu Lin 2017/01/09 23:23:04 not sure why this line slipped through last CL...
Nathan Parker 2017/01/10 01:25:13 Weird! At least it's a NOOP. :-)
401 if (rit->destination_url == search_url && 400 if (rit->destination_url == search_url &&
402 (target_tab_id == -1 || rit->target_tab_id == target_tab_id)) { 401 (target_tab_id == -1 || rit->target_tab_id == target_tab_id)) {
403 // If both source_url and source_main_frame_url are empty, and this 402 // If both source_url and source_main_frame_url are empty, and this
404 // navigation is not triggered by user, a retargeting navigation probably 403 // navigation is not triggered by user, a retargeting navigation probably
405 // causes this navigation. In this case, we skip this navigation event and 404 // causes this navigation. In this case, we skip this navigation event and
406 // looks for the retargeting navigation event. 405 // looks for the retargeting navigation event.
407 if (rit->source_url.is_empty() && rit->source_main_frame_url.is_empty() && 406 if (rit->source_url.is_empty() && rit->source_main_frame_url.is_empty() &&
408 !rit->is_user_initiated) { 407 !rit->is_user_initiated) {
409 // If there is a server redirection immediately after retargeting, we 408 // If there is a server redirection immediately after retargeting, we
410 // need to adjust our search url to the original request. 409 // need to adjust our search url to the original request.
411 if (rit->has_server_redirect){ 410 if (rit->has_server_redirect){
412 NavigationEvent* retargeting_nav_event = 411 NavigationEvent* retargeting_nav_event =
413 FindNavigationEvent(rit->original_request_url, 412 FindNavigationEvent(rit->original_request_url,
414 GURL(), 413 GURL(),
415 rit->target_tab_id); 414 rit->target_tab_id);
415 if (!retargeting_nav_event)
Nathan Parker 2017/01/10 01:25:13 Does this imply has_server_redirect was wrong?
Jialiu Lin 2017/01/10 02:15:12 Not necessarily. For some cases, previous Navigati
416 return nullptr;
416 // Adjust retargeting navigation event's attributes. 417 // Adjust retargeting navigation event's attributes.
417 retargeting_nav_event->has_server_redirect = true; 418 retargeting_nav_event->has_server_redirect = true;
418 retargeting_nav_event->destination_url = search_url; 419 retargeting_nav_event->destination_url = search_url;
419 return retargeting_nav_event; 420 return retargeting_nav_event;
420 } else { 421 } else {
421 continue; 422 continue;
422 } 423 }
423 } else { 424 } else {
424 return &*rit; 425 return &*rit;
425 } 426 }
426 } 427 }
427 } 428 }
428 return nullptr; 429 return nullptr;
429 } 430 }
430 431
431 void SafeBrowsingNavigationObserverManager::AddToReferrerChain( 432 void SafeBrowsingNavigationObserverManager::AddToReferrerChain(
432 std::vector<ReferrerChainEntry>* referrer_chain, 433 ReferrerChain* referrer_chain,
433 NavigationEvent* nav_event, 434 NavigationEvent* nav_event,
434 ReferrerChainEntry::URLType type) { 435 ReferrerChainEntry::URLType type) {
435 ReferrerChainEntry referrer_chain_entry; 436 std::unique_ptr<ReferrerChainEntry> referrer_chain_entry =
436 referrer_chain_entry.set_url(nav_event->destination_url.spec()); 437 base::MakeUnique<ReferrerChainEntry>();
437 referrer_chain_entry.set_type(type); 438 referrer_chain_entry->set_url(nav_event->destination_url.spec());
439 referrer_chain_entry->set_type(type);
438 auto ip_it = host_to_ip_map_.find(nav_event->destination_url.host()); 440 auto ip_it = host_to_ip_map_.find(nav_event->destination_url.host());
439 if (ip_it != host_to_ip_map_.end()) { 441 if (ip_it != host_to_ip_map_.end()) {
440 for (ResolvedIPAddress entry : ip_it->second) { 442 for (ResolvedIPAddress entry : ip_it->second) {
441 referrer_chain_entry.add_ip_addresses(entry.ip); 443 referrer_chain_entry->add_ip_addresses(entry.ip);
442 } 444 }
443 } 445 }
444 // Since we only track navigation to landing referrer, we will not log the 446 // Since we only track navigation to landing referrer, we will not log the
445 // referrer of the landing referrer page. 447 // referrer of the landing referrer page.
446 if (type != ReferrerChainEntry::LANDING_REFERRER) { 448 if (type != ReferrerChainEntry::LANDING_REFERRER) {
447 referrer_chain_entry.set_referrer_url(nav_event->source_url.spec()); 449 referrer_chain_entry->set_referrer_url(nav_event->source_url.spec());
448 referrer_chain_entry.set_referrer_main_frame_url( 450 referrer_chain_entry->set_referrer_main_frame_url(
449 nav_event->source_main_frame_url.spec()); 451 nav_event->source_main_frame_url.spec());
450 } 452 }
451 referrer_chain_entry.set_is_retargeting(nav_event->source_tab_id != 453 referrer_chain_entry->set_is_retargeting(nav_event->source_tab_id !=
452 nav_event->target_tab_id); 454 nav_event->target_tab_id);
453 referrer_chain_entry.set_navigation_time_msec( 455 referrer_chain_entry->set_navigation_time_msec(
454 nav_event->last_updated.ToJavaTime()); 456 nav_event->last_updated.ToJavaTime());
455 referrer_chain->push_back(std::move(referrer_chain_entry)); 457 referrer_chain->push_back(std::move(referrer_chain_entry));
456 } 458 }
457 459
458 void SafeBrowsingNavigationObserverManager::GetRemainingReferrerChain( 460 void SafeBrowsingNavigationObserverManager::GetRemainingReferrerChain(
459 NavigationEvent* last_nav_event_traced, 461 NavigationEvent* last_nav_event_traced,
460 int current_user_gesture_count, 462 int current_user_gesture_count,
461 int user_gesture_count_limit, 463 int user_gesture_count_limit,
462 std::vector<ReferrerChainEntry>* out_referrer_chain, 464 ReferrerChain* out_referrer_chain,
463 SafeBrowsingNavigationObserverManager::AttributionResult* out_result) { 465 SafeBrowsingNavigationObserverManager::AttributionResult* out_result) {
464 466
465 while (current_user_gesture_count < user_gesture_count_limit) { 467 while (current_user_gesture_count < user_gesture_count_limit) {
466 // Back trace to the next nav_event that was initiated by the user. 468 // Back trace to the next nav_event that was initiated by the user.
467 while (!last_nav_event_traced->is_user_initiated) { 469 while (!last_nav_event_traced->is_user_initiated) {
468 last_nav_event_traced = 470 last_nav_event_traced =
469 FindNavigationEvent(last_nav_event_traced->source_url, 471 FindNavigationEvent(last_nav_event_traced->source_url,
470 last_nav_event_traced->source_main_frame_url, 472 last_nav_event_traced->source_main_frame_url,
471 last_nav_event_traced->source_tab_id); 473 last_nav_event_traced->source_tab_id);
472 if (!last_nav_event_traced) 474 if (!last_nav_event_traced)
(...skipping 26 matching lines...) Expand all
499 501
500 AddToReferrerChain(out_referrer_chain, last_nav_event_traced, 502 AddToReferrerChain(out_referrer_chain, last_nav_event_traced,
501 GetURLTypeAndAdjustAttributionResult( 503 GetURLTypeAndAdjustAttributionResult(
502 current_user_gesture_count == 504 current_user_gesture_count ==
503 user_gesture_count_limit, 505 user_gesture_count_limit,
504 out_result)); 506 out_result));
505 } 507 }
506 } 508 }
507 509
508 } // namespace safe_browsing 510 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698