Index: chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc |
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc |
index 2ebc790a511a410e938f005d73fd73cf0619906c..520919173e529e176bdb79eb618fc29e137f60ce 100644 |
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc |
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc |
@@ -164,7 +164,10 @@ SafeBrowsingNavigationObserverManager::IdentifyReferrerChain( |
if (!target_url.is_valid()) |
return INVALID_URL; |
- NavigationEvent* nav_event = FindNavigationEvent(target_url, target_tab_id); |
+ NavigationEvent* nav_event = FindNavigationEvent( |
+ target_url, |
+ GURL(), |
+ target_tab_id); |
if (!nav_event) { |
// We cannot find a single navigation event related to this download. |
return NAVIGATION_EVENT_NOT_FOUND; |
@@ -178,7 +181,9 @@ SafeBrowsingNavigationObserverManager::IdentifyReferrerChain( |
// Back trace to the next nav_event that was initiated by the user. |
while (!nav_event->is_user_initiated) { |
nav_event = |
- FindNavigationEvent(nav_event->source_url, nav_event->source_tab_id); |
+ FindNavigationEvent(nav_event->source_url, |
+ nav_event->source_main_frame_url, |
+ nav_event->source_tab_id); |
if (!nav_event) |
return result; |
AddToReferrerChain(out_referrer_chain, nav_event, |
@@ -200,7 +205,9 @@ SafeBrowsingNavigationObserverManager::IdentifyReferrerChain( |
} |
nav_event = |
- FindNavigationEvent(nav_event->source_url, nav_event->source_tab_id); |
+ FindNavigationEvent(nav_event->source_url, |
+ nav_event->source_main_frame_url, |
+ nav_event->source_tab_id); |
if (!nav_event) |
return result; |
@@ -344,8 +351,16 @@ void SafeBrowsingNavigationObserverManager::ScheduleNextCleanUpAfterInterval( |
NavigationEvent* SafeBrowsingNavigationObserverManager::FindNavigationEvent( |
const GURL& target_url, |
+ const GURL& target_main_frame_url, |
int target_tab_id) { |
- auto it = navigation_map_.find(target_url); |
+ if (target_url.is_empty() && target_main_frame_url.is_empty()) |
+ return nullptr; |
+ |
+ // If target_url is empty, we should back trace navigation based on its |
+ // main frame URL instead. |
+ GURL search_url = target_url.is_empty() ? target_main_frame_url : target_url; |
Nathan Parker
2017/01/04 18:54:51
nit: could be
const GURL&
so you don't make a cop
Jialiu Lin
2017/01/04 21:47:01
Done.
|
+ |
+ auto it = navigation_map_.find(search_url); |
if (it == navigation_map_.end()) { |
return nullptr; |
} |
@@ -353,7 +368,7 @@ NavigationEvent* SafeBrowsingNavigationObserverManager::FindNavigationEvent( |
// the vector in reverse order to get the latest match. |
for (auto rit = it->second.rbegin(); rit != it->second.rend(); ++rit) { |
// If tab id is not valid, we only compare url, otherwise we compare both. |
- if (rit->destination_url == target_url && |
+ if (rit->destination_url == search_url && |
(target_tab_id == -1 || rit->target_tab_id == target_tab_id)) { |
// If both source_url and source_main_frame_url are empty, and this |
// navigation is not triggered by user, a retargeting navigation probably |