| 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 #ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_MANAGER_H
_ | 5 #ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_MANAGER_H
_ |
| 6 #define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_MANAGER_H
_ | 6 #define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_MANAGER_H
_ |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include "base/feature_list.h" | 9 #include "base/feature_list.h" |
| 10 #include "base/supports_user_data.h" | 10 #include "base/supports_user_data.h" |
| 11 #include "chrome/common/safe_browsing/csd.pb.h" | 11 #include "chrome/common/safe_browsing/csd.pb.h" |
| 12 #include "content/public/browser/notification_observer.h" | |
| 13 #include "content/public/browser/notification_registrar.h" | |
| 14 #include "content/public/browser/web_contents_observer.h" | 12 #include "content/public/browser/web_contents_observer.h" |
| 15 #include "third_party/protobuf/src/google/protobuf/repeated_field.h" | 13 #include "third_party/protobuf/src/google/protobuf/repeated_field.h" |
| 16 #include "url/gurl.h" | 14 #include "url/gurl.h" |
| 17 | 15 |
| 18 class Profile; | 16 class Profile; |
| 19 | 17 |
| 20 namespace safe_browsing { | 18 namespace safe_browsing { |
| 21 | 19 |
| 22 class SafeBrowsingNavigationObserver; | 20 class SafeBrowsingNavigationObserver; |
| 23 struct NavigationEvent; | 21 struct NavigationEvent; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 } | 85 } |
| 88 | 86 |
| 89 private: | 87 private: |
| 90 std::deque<std::unique_ptr<NavigationEvent>> navigation_events_; | 88 std::deque<std::unique_ptr<NavigationEvent>> navigation_events_; |
| 91 const std::size_t size_limit_; | 89 const std::size_t size_limit_; |
| 92 }; | 90 }; |
| 93 | 91 |
| 94 // Manager class for SafeBrowsingNavigationObserver, which is in charge of | 92 // Manager class for SafeBrowsingNavigationObserver, which is in charge of |
| 95 // cleaning up stale navigation events, and identifying landing page/landing | 93 // cleaning up stale navigation events, and identifying landing page/landing |
| 96 // referrer for a specific download. | 94 // referrer for a specific download. |
| 97 // TODO(jialiul): For now, SafeBrowsingNavigationObserverManager also listens to | |
| 98 // NOTIFICATION_RETARGETING as a way to detect cross frame/tab navigation. | |
| 99 // Remove base class content::NotificationObserver when | |
| 100 // WebContentsObserver::DidOpenRequestedURL() covers all retargeting cases. | |
| 101 class SafeBrowsingNavigationObserverManager | 95 class SafeBrowsingNavigationObserverManager |
| 102 : public content::NotificationObserver, | 96 : public base::RefCountedThreadSafe<SafeBrowsingNavigationObserverManager> { |
| 103 public base::RefCountedThreadSafe<SafeBrowsingNavigationObserverManager> { | |
| 104 public: | 97 public: |
| 105 static const base::Feature kDownloadAttribution; | 98 static const base::Feature kDownloadAttribution; |
| 106 | 99 |
| 107 // For UMA histogram counting. Do NOT change order. | 100 // For UMA histogram counting. Do NOT change order. |
| 108 enum AttributionResult { | 101 enum AttributionResult { |
| 109 SUCCESS = 1, // Identified referrer chain is not empty. | 102 SUCCESS = 1, // Identified referrer chain is not empty. |
| 110 SUCCESS_LANDING_PAGE = 2, // Successfully identified landing page. | 103 SUCCESS_LANDING_PAGE = 2, // Successfully identified landing page. |
| 111 SUCCESS_LANDING_REFERRER = 3, // Successfully identified landing referrer. | 104 SUCCESS_LANDING_REFERRER = 3, // Successfully identified landing referrer. |
| 112 INVALID_URL = 4, | 105 INVALID_URL = 4, |
| 113 NAVIGATION_EVENT_NOT_FOUND = 5, | 106 NAVIGATION_EVENT_NOT_FOUND = 5, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 // these identified NavigationEvents into ReferrerChainEntrys and append them | 175 // these identified NavigationEvents into ReferrerChainEntrys and append them |
| 183 // to |out_referrer_chain|. | 176 // to |out_referrer_chain|. |
| 184 AttributionResult IdentifyReferrerChainForDownloadHostingPage( | 177 AttributionResult IdentifyReferrerChainForDownloadHostingPage( |
| 185 const GURL& initiating_frame_url, | 178 const GURL& initiating_frame_url, |
| 186 const GURL& initiating_main_frame_url, | 179 const GURL& initiating_main_frame_url, |
| 187 int tab_id, | 180 int tab_id, |
| 188 bool has_user_gesture, | 181 bool has_user_gesture, |
| 189 int user_gesture_count_limit, | 182 int user_gesture_count_limit, |
| 190 ReferrerChain* out_referrer_chain); | 183 ReferrerChain* out_referrer_chain); |
| 191 | 184 |
| 185 // Record the creation of a new WebContents by |source_web_contents|. This is |
| 186 // used to detect cross-frame and cross-tab navigations. |
| 187 void RecordNewWebContents(content::WebContents* source_web_contents, |
| 188 int source_render_process_id, |
| 189 int source_render_frame_id, |
| 190 GURL target_url, |
| 191 content::WebContents* target_web_contents, |
| 192 bool not_yet_in_tabstrip); |
| 193 |
| 192 private: | 194 private: |
| 193 friend class base::RefCountedThreadSafe< | 195 friend class base::RefCountedThreadSafe< |
| 194 SafeBrowsingNavigationObserverManager>; | 196 SafeBrowsingNavigationObserverManager>; |
| 195 friend class TestNavigationObserverManager; | 197 friend class TestNavigationObserverManager; |
| 196 friend class SBNavigationObserverBrowserTest; | 198 friend class SBNavigationObserverBrowserTest; |
| 197 friend class SBNavigationObserverTest; | 199 friend class SBNavigationObserverTest; |
| 198 | 200 |
| 199 struct GurlHash { | 201 struct GurlHash { |
| 200 std::size_t operator()(const GURL& url) const { | 202 std::size_t operator()(const GURL& url) const { |
| 201 return std::hash<std::string>()(url.spec()); | 203 return std::hash<std::string>()(url.spec()); |
| 202 } | 204 } |
| 203 }; | 205 }; |
| 204 | 206 |
| 205 typedef std::unordered_map<content::WebContents*, base::Time> UserGestureMap; | 207 typedef std::unordered_map<content::WebContents*, base::Time> UserGestureMap; |
| 206 typedef std::unordered_map<std::string, std::vector<ResolvedIPAddress>> | 208 typedef std::unordered_map<std::string, std::vector<ResolvedIPAddress>> |
| 207 HostToIpMap; | 209 HostToIpMap; |
| 208 | 210 |
| 209 ~SafeBrowsingNavigationObserverManager() override; | 211 virtual ~SafeBrowsingNavigationObserverManager(); |
| 210 | |
| 211 // content::NotificationObserver: | |
| 212 void Observe(int type, | |
| 213 const content::NotificationSource& source, | |
| 214 const content::NotificationDetails& details) override; | |
| 215 | |
| 216 void RecordRetargeting(const content::NotificationDetails& details); | |
| 217 | 212 |
| 218 NavigationEventList* navigation_event_list() { | 213 NavigationEventList* navigation_event_list() { |
| 219 return &navigation_event_list_; | 214 return &navigation_event_list_; |
| 220 } | 215 } |
| 221 | 216 |
| 222 HostToIpMap* host_to_ip_map() { return &host_to_ip_map_; } | 217 HostToIpMap* host_to_ip_map() { return &host_to_ip_map_; } |
| 223 | 218 |
| 224 // Remove stale entries from navigation_event_list_ if they are older than | 219 // Remove stale entries from navigation_event_list_ if they are older than |
| 225 // kNavigationFootprintTTLInSecond (2 minutes). | 220 // kNavigationFootprintTTLInSecond (2 minutes). |
| 226 void CleanUpNavigationEvents(); | 221 void CleanUpNavigationEvents(); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 // shortly after a user gesture indicate this navigation is user initiated. | 259 // shortly after a user gesture indicate this navigation is user initiated. |
| 265 UserGestureMap user_gesture_map_; | 260 UserGestureMap user_gesture_map_; |
| 266 | 261 |
| 267 // Host to timestamped IP addresses map that covers all the main frame and | 262 // Host to timestamped IP addresses map that covers all the main frame and |
| 268 // subframe URLs' hosts. Since it is possible for a host to resolve to more | 263 // subframe URLs' hosts. Since it is possible for a host to resolve to more |
| 269 // than one IP in even a short period of time, we map a single host to a | 264 // than one IP in even a short period of time, we map a single host to a |
| 270 // vector of ResolvedIPAddresss. This map is used to fill in ip_address field | 265 // vector of ResolvedIPAddresss. This map is used to fill in ip_address field |
| 271 // in URLChainEntry in ClientDownloadRequest. | 266 // in URLChainEntry in ClientDownloadRequest. |
| 272 HostToIpMap host_to_ip_map_; | 267 HostToIpMap host_to_ip_map_; |
| 273 | 268 |
| 274 content::NotificationRegistrar registrar_; | |
| 275 | |
| 276 base::OneShotTimer cleanup_timer_; | 269 base::OneShotTimer cleanup_timer_; |
| 277 | 270 |
| 278 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingNavigationObserverManager); | 271 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingNavigationObserverManager); |
| 279 }; | 272 }; |
| 280 } // namespace safe_browsing | 273 } // namespace safe_browsing |
| 281 | 274 |
| 282 #endif // CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_MANAGE
R_H_ | 275 #endif // CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_MANAGE
R_H_ |
| OLD | NEW |