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 "base/strings/stringprintf.h" | 5 #include "base/strings/stringprintf.h" |
6 #include "chrome/browser/chrome_notification_types.h" | 6 #include "chrome/browser/chrome_notification_types.h" |
7 #include "chrome/browser/download/download_prefs.h" | 7 #include "chrome/browser/download/download_prefs.h" |
8 #include "chrome/browser/profiles/profile.h" | 8 #include "chrome/browser/profiles/profile.h" |
| 9 #include "chrome/browser/safe_browsing/download_protection_service.h" |
9 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h" | 10 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h" |
10 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager
.h" | 11 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager
.h" |
| 12 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" |
11 #include "chrome/browser/sessions/session_tab_helper.h" | 13 #include "chrome/browser/sessions/session_tab_helper.h" |
12 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
13 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 15 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
14 #include "chrome/common/pref_names.h" | 16 #include "chrome/common/pref_names.h" |
15 #include "chrome/test/base/in_process_browser_test.h" | 17 #include "chrome/test/base/in_process_browser_test.h" |
16 #include "chrome/test/base/ui_test_utils.h" | 18 #include "chrome/test/base/ui_test_utils.h" |
17 #include "components/prefs/pref_service.h" | 19 #include "components/prefs/pref_service.h" |
18 #include "content/public/browser/browser_context.h" | 20 #include "content/public/browser/browser_context.h" |
19 #include "content/public/browser/download_item.h" | 21 #include "content/public/browser/download_item.h" |
20 #include "content/public/browser/download_manager.h" | 22 #include "content/public/browser/download_manager.h" |
21 #include "content/public/browser/notification_service.h" | 23 #include "content/public/browser/notification_service.h" |
22 #include "content/public/test/browser_test_utils.h" | 24 #include "content/public/test/browser_test_utils.h" |
23 #include "content/public/test/test_navigation_observer.h" | 25 #include "content/public/test/test_navigation_observer.h" |
24 #include "content/public/test/test_utils.h" | 26 #include "content/public/test/test_utils.h" |
25 #include "net/dns/mock_host_resolver.h" | 27 #include "net/dns/mock_host_resolver.h" |
26 #include "net/test/embedded_test_server/embedded_test_server.h" | 28 #include "net/test/embedded_test_server/embedded_test_server.h" |
27 #include "url/gurl.h" | 29 #include "url/gurl.h" |
28 #include "url/url_canon.h" | 30 #include "url/url_canon.h" |
29 | 31 |
| 32 using content::DownloadItem; |
| 33 |
30 namespace safe_browsing { | 34 namespace safe_browsing { |
31 | 35 |
32 const char kSingleFrameTestURL[] = | 36 const char kSingleFrameTestURL[] = |
33 "/safe_browsing/download_protection/navigation_observer/" | 37 "/safe_browsing/download_protection/navigation_observer/" |
34 "navigation_observer_tests.html"; | 38 "navigation_observer_tests.html"; |
35 const char kMultiFrameTestURL[] = | 39 const char kMultiFrameTestURL[] = |
36 "/safe_browsing/download_protection/navigation_observer/" | 40 "/safe_browsing/download_protection/navigation_observer/" |
37 "navigation_observer_multi_frame_tests.html"; | 41 "navigation_observer_multi_frame_tests.html"; |
38 const char kRedirectURL[] = | 42 const char kRedirectURL[] = |
39 "/safe_browsing/download_protection/navigation_observer/redirect.html"; | 43 "/safe_browsing/download_protection/navigation_observer/redirect.html"; |
40 const char kDownloadDataURL[] = | 44 const char kDownloadDataURL[] = |
41 "data:application/octet-stream;base64,a2poYWxrc2hkbGtoYXNka2xoYXNsa2RoYWxra" | 45 "data:application/octet-stream;base64,a2poYWxrc2hkbGtoYXNka2xoYXNsa2RoYWxra" |
42 "GtoYWxza2hka2xzamFoZGxramhhc2xka2hhc2xrZGgKYXNrZGpoa2FzZGpoYWtzaGRrYXNoZGt" | 46 "GtoYWxza2hka2xzamFoZGxramhhc2xka2hhc2xrZGgKYXNrZGpoa2FzZGpoYWtzaGRrYXNoZGt" |
43 "oYXNrZGhhc2tkaGthc2hka2Foc2RraGFrc2hka2FzaGRraGFzCmFza2pkaGFrc2hkbSxjbmtza" | 47 "oYXNrZGhhc2tkaGthc2hka2Foc2RraGFrc2hka2FzaGRraGFzCmFza2pkaGFrc2hkbSxjbmtza" |
44 "mFoZGtoYXNrZGhhc2tka2hrYXNkCjg3MzQ2ODEyNzQ2OGtqc2hka2FoZHNrZGhraApha3NqZGt" | 48 "mFoZGtoYXNrZGhhc2tka2hrYXNkCjg3MzQ2ODEyNzQ2OGtqc2hka2FoZHNrZGhraApha3NqZGt" |
45 "hc2Roa3NkaGthc2hka2FzaGtkaAohISomXkAqJl4qYWhpZGFzeWRpeWlhc1xcb1wKa2Fqc2Roa" | 49 "hc2Roa3NkaGthc2hka2FzaGtkaAohISomXkAqJl4qYWhpZGFzeWRpeWlhc1xcb1wKa2Fqc2Roa" |
46 "2FzaGRrYXNoZGsKYWtzamRoc2tkaAplbmQK"; | 50 "2FzaGRrYXNoZGsKYWtzamRoc2tkaAplbmQK"; |
47 const char kIframeDirectDownloadURL[] = | 51 const char kIframeDirectDownloadURL[] = |
48 "/safe_browsing/download_protection/navigation_observer/iframe.html"; | 52 "/safe_browsing/download_protection/navigation_observer/iframe.html"; |
49 const char kIframeRetargetingURL[] = | 53 const char kIframeRetargetingURL[] = |
50 "/safe_browsing/download_protection/navigation_observer/" | 54 "/safe_browsing/download_protection/navigation_observer/" |
51 "iframe_retargeting.html"; | 55 "iframe_retargeting.html"; |
52 const char kDownloadItemURL[] = "/safe_browsing/download_protection/signed.exe"; | 56 const char kDownloadItemURL[] = "/safe_browsing/download_protection/signed.exe"; |
| 57 const char kRedirectToLandingURL[] = |
| 58 "/safe_browsing/download_protection/navigation_observer/" |
| 59 "redirect_to_landing.html"; |
| 60 const char kLandingURL[] = |
| 61 "/safe_browsing/download_protection/navigation_observer/" |
| 62 "landing.html"; |
| 63 const char kLandingReferrerURL[] = |
| 64 "/safe_browsing/download_protection/navigation_observer/" |
| 65 "landing_referrer.html"; |
| 66 const char kPageBeforeLandingReferrerURL[] = |
| 67 "/safe_browsing/download_protection/navigation_observer/" |
| 68 "page_before_landing_referrer.html"; |
53 | 69 |
54 // Test class to help create SafeBrowsingNavigationObservers for each | 70 // Test class to help create SafeBrowsingNavigationObservers for each |
55 // WebContents before they are actually installed through AttachTabHelper. | 71 // WebContents before they are actually installed through AttachTabHelper. |
56 class TestNavigationObserverManager | 72 class TestNavigationObserverManager |
57 : public SafeBrowsingNavigationObserverManager { | 73 : public SafeBrowsingNavigationObserverManager { |
58 public: | 74 public: |
59 TestNavigationObserverManager() : SafeBrowsingNavigationObserverManager() { | 75 TestNavigationObserverManager() : SafeBrowsingNavigationObserverManager() { |
60 registrar_.Add(this, chrome::NOTIFICATION_TAB_ADDED, | 76 registrar_.Add(this, chrome::NOTIFICATION_TAB_ADDED, |
61 content::NotificationService::AllSources()); | 77 content::NotificationService::AllSources()); |
62 } | 78 } |
(...skipping 23 matching lines...) Expand all Loading... |
86 class SBNavigationObserverBrowserTest : public InProcessBrowserTest { | 102 class SBNavigationObserverBrowserTest : public InProcessBrowserTest { |
87 public: | 103 public: |
88 SBNavigationObserverBrowserTest() {} | 104 SBNavigationObserverBrowserTest() {} |
89 | 105 |
90 void SetUpOnMainThread() override { | 106 void SetUpOnMainThread() override { |
91 // Disable Safe Browsing service since it is irrelevant to this test. | 107 // Disable Safe Browsing service since it is irrelevant to this test. |
92 browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, | 108 browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, |
93 false); | 109 false); |
94 ASSERT_TRUE(embedded_test_server()->Start()); | 110 ASSERT_TRUE(embedded_test_server()->Start()); |
95 host_resolver()->AddRule("*", "127.0.0.1"); | 111 host_resolver()->AddRule("*", "127.0.0.1"); |
96 // Navigate to test page. | |
97 ui_test_utils::NavigateToURL( | |
98 browser(), embedded_test_server()->GetURL(kSingleFrameTestURL)); | |
99 observer_manager_ = new TestNavigationObserverManager(); | 112 observer_manager_ = new TestNavigationObserverManager(); |
100 observer_ = new SafeBrowsingNavigationObserver( | 113 observer_ = new SafeBrowsingNavigationObserver( |
101 browser()->tab_strip_model()->GetActiveWebContents(), | 114 browser()->tab_strip_model()->GetActiveWebContents(), |
102 observer_manager_); | 115 observer_manager_); |
103 ASSERT_TRUE(observer_); | 116 ASSERT_TRUE(observer_); |
104 ASSERT_TRUE(InitialSetup()); | 117 ASSERT_TRUE(InitialSetup()); |
| 118 // Navigate to test page. |
| 119 ui_test_utils::NavigateToURL( |
| 120 browser(), embedded_test_server()->GetURL(kSingleFrameTestURL)); |
105 } | 121 } |
106 | 122 |
107 bool InitialSetup() { | 123 bool InitialSetup() { |
108 if (!browser()) | 124 if (!browser()) |
109 return false; | 125 return false; |
110 | 126 |
111 if (!downloads_directory_.CreateUniqueTempDir()) | 127 if (!downloads_directory_.CreateUniqueTempDir()) |
112 return false; | 128 return false; |
113 | 129 |
114 // Set up default download path. | 130 // Set up default download path. |
115 browser()->profile()->GetPrefs()->SetFilePath( | 131 browser()->profile()->GetPrefs()->SetFilePath( |
116 prefs::kDownloadDefaultDirectory, downloads_directory_.GetPath()); | 132 prefs::kDownloadDefaultDirectory, downloads_directory_.GetPath()); |
117 browser()->profile()->GetPrefs()->SetFilePath( | 133 browser()->profile()->GetPrefs()->SetFilePath( |
118 prefs::kSaveFileDefaultDirectory, downloads_directory_.GetPath()); | 134 prefs::kSaveFileDefaultDirectory, downloads_directory_.GetPath()); |
119 browser()->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload, | 135 browser()->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload, |
120 false); | 136 false); |
121 content::DownloadManager* manager = | 137 content::DownloadManager* manager = |
122 content::BrowserContext::GetDownloadManager(browser()->profile()); | 138 content::BrowserContext::GetDownloadManager(browser()->profile()); |
123 DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpen(); | 139 DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpen(); |
124 manager->RemoveAllDownloads(); | 140 manager->RemoveAllDownloads(); |
125 | 141 |
126 return true; | 142 return true; |
127 } | 143 } |
128 | 144 |
129 void TearDownOnMainThread() override { delete observer_; } | 145 void TearDownOnMainThread() override { |
| 146 // Cancel unfinished download if any. |
| 147 CancelDownloads(); |
| 148 delete observer_; |
| 149 } |
130 | 150 |
131 // Most test cases will trigger downloads, though we don't really care if | 151 // Most test cases will trigger downloads, though we don't really care if |
132 // download completed or not. So we cancel downloads as soon as we record | 152 // download completed or not. So we cancel downloads as soon as we record |
133 // all the navigation events we need. | 153 // all the navigation events we need. |
134 void CancelDownloads() { | 154 void CancelDownloads() { |
135 std::vector<content::DownloadItem*> download_items; | 155 std::vector<DownloadItem*> download_items; |
136 content::DownloadManager* manager = | 156 content::DownloadManager* manager = |
137 content::BrowserContext::GetDownloadManager(browser()->profile()); | 157 content::BrowserContext::GetDownloadManager(browser()->profile()); |
138 manager->GetAllDownloads(&download_items); | 158 manager->GetAllDownloads(&download_items); |
139 for (auto item : download_items) { | 159 for (auto item : download_items) { |
140 if (!item->IsDone()) | 160 if (!item->IsDone()) |
141 item->Cancel(true); | 161 item->Cancel(true); |
142 } | 162 } |
143 } | 163 } |
144 | 164 |
145 // This function needs javascript support, only works on | 165 DownloadItem* GetDownload() { |
146 // navigation_observer_tests.html and | 166 std::vector<DownloadItem*> download_items; |
147 // navigation_observer_multi_frame_tests.html. | 167 content::DownloadManager* manager = |
148 void ClickTestLink(const char* test_name, | 168 content::BrowserContext::GetDownloadManager(browser()->profile()); |
149 int number_of_navigations) { | 169 manager->GetAllDownloads(&download_items); |
| 170 EXPECT_EQ(1U, download_items.size()); |
| 171 return download_items[0]; |
| 172 } |
| 173 |
| 174 // This function needs javascript support from the test page hosted at |
| 175 // |page_url|. It calls "clickLink(..)" javascript function to "click" on the |
| 176 // html element with ID specified by |element_id|, and waits for |
| 177 // |number_of_navigations| to complete. |
| 178 void ClickTestLink(const char* element_id, |
| 179 int number_of_navigations, |
| 180 const GURL& page_url) { |
150 TabStripModel* tab_strip = browser()->tab_strip_model(); | 181 TabStripModel* tab_strip = browser()->tab_strip_model(); |
151 content::WebContents* current_web_contents = | 182 content::WebContents* current_web_contents = |
152 tab_strip->GetActiveWebContents(); | 183 tab_strip->GetActiveWebContents(); |
153 ASSERT_TRUE(content::WaitForLoadStop(current_web_contents)); | 184 ASSERT_TRUE(content::WaitForLoadStop(current_web_contents)); |
154 content::TestNavigationObserver navigation_observer( | 185 content::TestNavigationObserver navigation_observer( |
155 current_web_contents, | 186 current_web_contents, |
156 number_of_navigations); | 187 number_of_navigations); |
157 navigation_observer.StartWatchingNewWebContents(); | 188 navigation_observer.StartWatchingNewWebContents(); |
158 // Execute test. | 189 // Execute test. |
159 std::string script = base::StringPrintf("clickLink('%s');", test_name); | 190 std::string script = base::StringPrintf("clickLink('%s');", element_id); |
160 ASSERT_TRUE(content::ExecuteScript(current_web_contents, script)); | 191 ASSERT_TRUE(content::ExecuteScript(current_web_contents, script)); |
161 // Wait for navigations on current tab and new tab (if any) to finish. | 192 // Wait for navigations on current tab and new tab (if any) to finish. |
162 navigation_observer.Wait(); | 193 navigation_observer.Wait(); |
163 navigation_observer.StopWatchingNewWebContents(); | 194 navigation_observer.StopWatchingNewWebContents(); |
164 // Cancel unfinished download if any. | 195 |
165 CancelDownloads(); | 196 // Since this test uses javascript to mimic clicking on a link (no actual |
| 197 // user gesture), and DidGetUserInteraction() does not respond to |
| 198 // ExecuteScript(), is_user_initiated field in resulting NavigationEvents |
| 199 // will always be false. Therefore, we need to make some adjustment to |
| 200 // relevant NavigationEvent. |
| 201 for (auto it = navigation_map()->begin(); it != navigation_map()->end(); |
| 202 it++) { |
| 203 for (NavigationEvent& nav_event : it->second) { |
| 204 if (nav_event.source_url == page_url) { |
| 205 nav_event.is_user_initiated = true; |
| 206 return; |
| 207 } |
| 208 } |
| 209 } |
166 } | 210 } |
167 | 211 |
168 void VerifyNavigationEvent(const GURL& expected_source_url, | 212 void VerifyNavigationEvent(const GURL& expected_source_url, |
169 const GURL& expected_source_main_frame_url, | 213 const GURL& expected_source_main_frame_url, |
170 const GURL& expected_original_request_url, | 214 const GURL& expected_original_request_url, |
171 const GURL& expected_destination_url, | 215 const GURL& expected_destination_url, |
172 bool expected_is_user_initiated, | 216 bool expected_is_user_initiated, |
173 bool expected_has_committed, | 217 bool expected_has_committed, |
174 bool expected_has_server_redirect, | 218 bool expected_has_server_redirect, |
175 const NavigationEvent& actual_nav_event) { | 219 const NavigationEvent& actual_nav_event) { |
176 EXPECT_EQ(expected_source_url, actual_nav_event.source_url); | 220 EXPECT_EQ(expected_source_url, actual_nav_event.source_url); |
177 EXPECT_EQ(expected_source_main_frame_url, | 221 EXPECT_EQ(expected_source_main_frame_url, |
178 actual_nav_event.source_main_frame_url); | 222 actual_nav_event.source_main_frame_url); |
179 EXPECT_EQ(expected_original_request_url, | 223 EXPECT_EQ(expected_original_request_url, |
180 actual_nav_event.original_request_url); | 224 actual_nav_event.original_request_url); |
181 EXPECT_EQ(expected_destination_url, actual_nav_event.destination_url); | 225 EXPECT_EQ(expected_destination_url, actual_nav_event.destination_url); |
182 EXPECT_EQ(expected_is_user_initiated, actual_nav_event.is_user_initiated); | 226 EXPECT_EQ(expected_is_user_initiated, actual_nav_event.is_user_initiated); |
183 EXPECT_EQ(expected_has_committed, actual_nav_event.has_committed); | 227 EXPECT_EQ(expected_has_committed, actual_nav_event.has_committed); |
184 EXPECT_EQ(expected_has_server_redirect, | 228 EXPECT_EQ(expected_has_server_redirect, |
185 actual_nav_event.has_server_redirect); | 229 actual_nav_event.has_server_redirect); |
186 } | 230 } |
187 | 231 |
| 232 void VerifyReferrerChainEntry(const GURL& expected_url, |
| 233 ReferrerChainEntry::URLType expected_type, |
| 234 const std::string& expected_ip_address, |
| 235 const GURL& expected_referrer_url, |
| 236 const GURL& expected_referrer_main_frame_url, |
| 237 bool expected_is_retargeting, |
| 238 ReferrerChainEntry actual_entry) { |
| 239 EXPECT_EQ(expected_url.spec(), actual_entry.url()); |
| 240 EXPECT_EQ(expected_type, actual_entry.type()); |
| 241 if (expected_ip_address.empty()) { |
| 242 ASSERT_EQ(0, actual_entry.ip_addresses_size()); |
| 243 } else { |
| 244 ASSERT_EQ(1, actual_entry.ip_addresses_size()); |
| 245 EXPECT_EQ(expected_ip_address, actual_entry.ip_addresses(0)); |
| 246 } |
| 247 EXPECT_EQ(expected_referrer_url.spec(), actual_entry.referrer_url()); |
| 248 EXPECT_EQ(expected_referrer_main_frame_url.spec(), |
| 249 actual_entry.referrer_main_frame_url()); |
| 250 EXPECT_EQ(expected_is_retargeting, actual_entry.is_retargeting()); |
| 251 } |
| 252 |
| 253 std::vector<ReferrerChainEntry> IdentifyReferrerChain( |
| 254 DownloadItem* download) { |
| 255 std::vector<ReferrerChainEntry> referrer_chain; |
| 256 int download_tab_id = |
| 257 SessionTabHelper::IdForTab(download->GetWebContents()); |
| 258 // IdentifyReferrerChain should return SUCCESS(1), SUCCESS_LANDING_PAGE(2), |
| 259 // or SUCCESS_LANDING_REFERRER(3) in all these tests. |
| 260 EXPECT_LE(observer_manager_->IdentifyReferrerChain( |
| 261 download->GetURL(), download_tab_id, |
| 262 2, // kDownloadAttributionUserGestureLimit |
| 263 &referrer_chain), |
| 264 SafeBrowsingNavigationObserverManager::SUCCESS_LANDING_REFERRER); |
| 265 return referrer_chain; |
| 266 } |
| 267 |
188 void VerifyHostToIpMap() { | 268 void VerifyHostToIpMap() { |
189 // Since all testing pages have the same host, there is only one entry in | 269 // Since all testing pages have the same host, there is only one entry in |
190 // host_to_ip_map_. | 270 // host_to_ip_map_. |
191 SafeBrowsingNavigationObserverManager::HostToIpMap* actual_host_ip_map = | 271 SafeBrowsingNavigationObserverManager::HostToIpMap* actual_host_ip_map = |
192 host_to_ip_map(); | 272 host_to_ip_map(); |
193 ASSERT_EQ(std::size_t(1), actual_host_ip_map->size()); | 273 ASSERT_EQ(1U, actual_host_ip_map->size()); |
194 auto ip_list = | 274 auto ip_list = |
195 actual_host_ip_map->at(embedded_test_server()->base_url().host()); | 275 actual_host_ip_map->at(embedded_test_server()->base_url().host()); |
196 ASSERT_EQ(std::size_t(1), ip_list.size()); | 276 ASSERT_EQ(1U, ip_list.size()); |
197 EXPECT_EQ(embedded_test_server()->host_port_pair().host(), | 277 EXPECT_EQ(embedded_test_server()->host_port_pair().host(), |
198 ip_list.back().ip); | 278 ip_list.back().ip); |
199 } | 279 } |
200 | 280 |
201 SafeBrowsingNavigationObserverManager::NavigationMap* navigation_map() { | 281 SafeBrowsingNavigationObserverManager::NavigationMap* navigation_map() { |
202 return observer_manager_->navigation_map(); | 282 return observer_manager_->navigation_map(); |
203 } | 283 } |
204 | 284 |
205 SafeBrowsingNavigationObserverManager::HostToIpMap* host_to_ip_map() { | 285 SafeBrowsingNavigationObserverManager::HostToIpMap* host_to_ip_map() { |
206 return observer_manager_->host_to_ip_map(); | 286 return observer_manager_->host_to_ip_map(); |
207 } | 287 } |
208 | 288 |
209 protected: | 289 protected: |
210 SafeBrowsingNavigationObserverManager* observer_manager_; | 290 SafeBrowsingNavigationObserverManager* observer_manager_; |
211 SafeBrowsingNavigationObserver* observer_; | 291 SafeBrowsingNavigationObserver* observer_; |
212 | 292 |
213 private: | 293 private: |
214 base::ScopedTempDir downloads_directory_; | 294 base::ScopedTempDir downloads_directory_; |
215 }; | 295 }; |
216 | 296 |
| 297 // Type download URL into address bar and start download on the same page. |
| 298 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, TypeInURLDownload) { |
| 299 ui_test_utils::NavigateToURL( |
| 300 browser(), embedded_test_server()->GetURL(kDownloadItemURL)); |
| 301 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 302 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 303 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
| 304 auto nav_map = navigation_map(); |
| 305 ASSERT_TRUE(nav_map); |
| 306 ASSERT_EQ(2U, nav_map->size()); |
| 307 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 308 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 309 VerifyNavigationEvent(GURL(), // source_url |
| 310 GURL(), // source_main_frame_url |
| 311 initial_url, // original_request_url |
| 312 initial_url, // destination_url |
| 313 true, // is_user_initiated, |
| 314 true, // has_committed |
| 315 false, // has_server_redirect |
| 316 nav_map->at(initial_url).at(0)); |
| 317 VerifyNavigationEvent(GURL(), // source_url |
| 318 GURL(), // source_main_frame_url |
| 319 download_url, // original_request_url |
| 320 download_url, // destination_url |
| 321 true, // is_user_initiated, |
| 322 false, // has_committed |
| 323 false, // has_server_redirect |
| 324 nav_map->at(download_url).at(0)); |
| 325 VerifyHostToIpMap(); |
| 326 |
| 327 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 328 ASSERT_EQ(1U, referrer_chain.size()); |
| 329 VerifyReferrerChainEntry(download_url, // url |
| 330 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 331 test_server_ip, // ip_address |
| 332 GURL(), // referrer_url |
| 333 GURL(), // referrer_main_frame_url |
| 334 false, // is_retargeting |
| 335 referrer_chain[0]); |
| 336 } |
217 // Click on a link and start download on the same page. | 337 // Click on a link and start download on the same page. |
218 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, DirectDownload) { | 338 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, DirectDownload) { |
219 ClickTestLink("direct_download", 1); | |
220 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 339 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 340 ClickTestLink("direct_download", 1, initial_url); |
221 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 341 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 342 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
222 auto nav_map = navigation_map(); | 343 auto nav_map = navigation_map(); |
223 ASSERT_TRUE(nav_map); | 344 ASSERT_TRUE(nav_map); |
224 ASSERT_EQ(std::size_t(1), nav_map->size()); | 345 ASSERT_EQ(2U, nav_map->size()); |
225 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 346 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
226 // Since this test uses javascript to mimic clicking on a link (no actual user | 347 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
227 // gesture), and DidGetUserInteraction() does not respond to ExecuteScript(), | 348 VerifyNavigationEvent(GURL(), // source_url |
228 // therefore is_user_initiated is false. | 349 GURL(), // source_main_frame_url |
| 350 initial_url, // original_request_url |
| 351 initial_url, // destination_url |
| 352 true, // is_user_initiated, |
| 353 true, // has_committed |
| 354 false, // has_server_redirect |
| 355 nav_map->at(initial_url).at(0)); |
229 VerifyNavigationEvent(initial_url, // source_url | 356 VerifyNavigationEvent(initial_url, // source_url |
230 initial_url, // source_main_frame_url | 357 initial_url, // source_main_frame_url |
231 download_url, // original_request_url | 358 download_url, // original_request_url |
232 download_url, // destination_url | 359 download_url, // destination_url |
233 false, // is_user_initiated, | 360 true, // is_user_initiated, |
234 false, // has_committed | 361 false, // has_committed |
235 false, // has_server_redirect | 362 false, // has_server_redirect |
236 nav_map->at(download_url).at(0)); | 363 nav_map->at(download_url).at(0)); |
237 VerifyHostToIpMap(); | 364 VerifyHostToIpMap(); |
| 365 |
| 366 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 367 ASSERT_EQ(2U, referrer_chain.size()); |
| 368 VerifyReferrerChainEntry(download_url, // url |
| 369 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 370 test_server_ip, // ip_address |
| 371 initial_url, // referrer_url |
| 372 initial_url, // referrer_main_frame_url |
| 373 false, // is_retargeting |
| 374 referrer_chain[0]); |
| 375 VerifyReferrerChainEntry(initial_url, // url |
| 376 ReferrerChainEntry::LANDING_PAGE, // type |
| 377 test_server_ip, // ip_address |
| 378 GURL(), // referrer_url |
| 379 GURL(), // referrer_main_frame_url |
| 380 false, // is_retargeting |
| 381 referrer_chain[1]); |
238 } | 382 } |
239 | 383 |
240 // Click on a link with rel="noreferrer" attribute, and start download on the | 384 // Click on a link with rel="noreferrer" attribute, and start download on the |
241 // same page. | 385 // same page. |
242 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 386 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
243 DirectDownloadNoReferrer) { | 387 DirectDownloadNoReferrer) { |
244 ClickTestLink("direct_download_noreferrer", 1); | |
245 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 388 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 389 ClickTestLink("direct_download_noreferrer", 1, initial_url); |
246 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 390 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 391 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
247 auto nav_map = navigation_map(); | 392 auto nav_map = navigation_map(); |
248 ASSERT_TRUE(nav_map); | 393 ASSERT_TRUE(nav_map); |
249 ASSERT_EQ(std::size_t(1), nav_map->size()); | 394 ASSERT_EQ(2U, nav_map->size()); |
250 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 395 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 396 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 397 VerifyNavigationEvent(GURL(), // source_url |
| 398 GURL(), // source_main_frame_url |
| 399 initial_url, // original_request_url |
| 400 initial_url, // destination_url |
| 401 true, // is_user_initiated, |
| 402 true, // has_committed |
| 403 false, // has_server_redirect |
| 404 nav_map->at(initial_url).at(0)); |
251 VerifyNavigationEvent(initial_url, // source_url | 405 VerifyNavigationEvent(initial_url, // source_url |
252 initial_url, // source_main_frame_url | 406 initial_url, // source_main_frame_url |
253 download_url, // original_request_url | 407 download_url, // original_request_url |
254 download_url, // destination_url | 408 download_url, // destination_url |
255 false, // is_user_initiated, | 409 true, // is_user_initiated, |
256 false, // has_committed | 410 false, // has_committed |
257 false, // has_server_redirect | 411 false, // has_server_redirect |
258 nav_map->at(download_url).at(0)); | 412 nav_map->at(download_url).at(0)); |
259 VerifyHostToIpMap(); | 413 VerifyHostToIpMap(); |
| 414 |
| 415 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 416 ASSERT_EQ(2U, referrer_chain.size()); |
| 417 VerifyReferrerChainEntry(download_url, // url |
| 418 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 419 test_server_ip, // ip_address |
| 420 initial_url, // referrer_url |
| 421 initial_url, // referrer_main_frame_url |
| 422 false, // is_retargeting |
| 423 referrer_chain[0]); |
| 424 VerifyReferrerChainEntry(initial_url, // url |
| 425 ReferrerChainEntry::LANDING_PAGE, // type |
| 426 test_server_ip, // ip_address |
| 427 GURL(), // referrer_url |
| 428 GURL(), // referrer_main_frame_url |
| 429 false, // is_retargeting |
| 430 referrer_chain[1]); |
260 } | 431 } |
261 | 432 |
262 // Click on a link with rel="noreferrer" attribute, and start download in a | 433 // Click on a link with rel="noreferrer" attribute, and start download in a |
263 // new tab using target=_blank. | 434 // new tab using target=_blank. |
264 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 435 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
265 DirectDownloadNoReferrerTargetBlank) { | 436 DirectDownloadNoReferrerTargetBlank) { |
266 ClickTestLink("direct_download_noreferrer_target_blank", 1); | |
267 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 437 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 438 ClickTestLink("direct_download_noreferrer_target_blank", 1, initial_url); |
268 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 439 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 440 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
269 auto nav_map = navigation_map(); | 441 auto nav_map = navigation_map(); |
270 ASSERT_TRUE(nav_map); | 442 ASSERT_TRUE(nav_map); |
271 ASSERT_EQ(std::size_t(1), nav_map->size()); | 443 ASSERT_EQ(2U, nav_map->size()); |
272 ASSERT_EQ(std::size_t(2), nav_map->at(download_url).size()); | 444 ASSERT_EQ(2U, nav_map->at(download_url).size()); |
273 // The first NavigationEvent was obtained from NOIFICATION_RETARGETING. | 445 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 446 VerifyNavigationEvent(GURL(), // source_url |
| 447 GURL(), // source_main_frame_url |
| 448 initial_url, // original_request_url |
| 449 initial_url, // destination_url |
| 450 true, // is_user_initiated, |
| 451 true, // has_committed |
| 452 false, // has_server_redirect |
| 453 nav_map->at(initial_url).at(0)); |
| 454 // The next NavigationEvent was obtained from NOIFICATION_RETARGETING. |
274 // TODO(jialiul): After https://crbug.com/651895 is fixed, we'll no longer | 455 // TODO(jialiul): After https://crbug.com/651895 is fixed, we'll no longer |
275 // listen to NOTIFICATION_RETARGETING, hence only one NavigationEvent will | 456 // listen to NOTIFICATION_RETARGETING, hence only one NavigationEvent will |
276 // be observed with the true initator URL. This applies to other new tab | 457 // be observed with the true initator URL. This applies to other new tab |
277 // download, and target blank download test cases too. | 458 // download, and target blank download test cases too. |
278 VerifyNavigationEvent(initial_url, // source_url | 459 VerifyNavigationEvent(initial_url, // source_url |
279 initial_url, // source_main_frame_url | 460 initial_url, // source_main_frame_url |
280 download_url, // original_request_url | 461 download_url, // original_request_url |
281 download_url, // destination_url | 462 download_url, // destination_url |
282 false, // is_user_initiated, | 463 true, // is_user_initiated, |
283 false, // has_committed | 464 false, // has_committed |
284 false, // has_server_redirect | 465 false, // has_server_redirect |
285 nav_map->at(download_url).at(0)); | 466 nav_map->at(download_url).at(0)); |
286 // The second one is the actual navigation which triggers download. | 467 // This one is the actual navigation which triggers download. |
287 VerifyNavigationEvent(GURL(), // source_url | 468 VerifyNavigationEvent(GURL(), // source_url |
288 GURL(), // source_main_frame_url | 469 GURL(), // source_main_frame_url |
289 download_url, // original_request_url | 470 download_url, // original_request_url |
290 download_url, // destination_url | 471 download_url, // destination_url |
291 false, // is_user_initiated, | 472 false, // is_user_initiated, |
292 false, // has_committed | 473 false, // has_committed |
293 false, // has_server_redirect | 474 false, // has_server_redirect |
294 nav_map->at(download_url).at(1)); | 475 nav_map->at(download_url).at(1)); |
295 VerifyHostToIpMap(); | 476 VerifyHostToIpMap(); |
| 477 |
| 478 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 479 ASSERT_EQ(2U, referrer_chain.size()); |
| 480 VerifyReferrerChainEntry(download_url, // url |
| 481 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 482 test_server_ip, // ip_address |
| 483 initial_url, // referrer_url |
| 484 initial_url, // referrer_main_frame_url |
| 485 true, // is_retargeting |
| 486 referrer_chain[0]); |
| 487 VerifyReferrerChainEntry(initial_url, // url |
| 488 ReferrerChainEntry::LANDING_PAGE, // type |
| 489 test_server_ip, // ip_address |
| 490 GURL(), // referrer_url |
| 491 GURL(), // referrer_main_frame_url |
| 492 false, // is_retargeting |
| 493 referrer_chain[1]); |
296 } | 494 } |
297 | 495 |
298 // Click on a link which navigates to a page then redirects to a download using | 496 // Click on a link which navigates to a page then redirects to a download using |
299 // META HTTP-EQUIV="refresh". All transitions happen in the same tab. | 497 // META HTTP-EQUIV="refresh". All transitions happen in the same tab. |
300 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 498 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
301 SingleMetaRefreshRedirect) { | 499 SingleMetaRefreshRedirect) { |
302 ClickTestLink("single_meta_refresh_redirect", 2); | |
303 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 500 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 501 ClickTestLink("single_meta_refresh_redirect", 2, initial_url); |
304 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); | 502 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
305 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 503 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 504 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
306 auto nav_map = navigation_map(); | 505 auto nav_map = navigation_map(); |
307 ASSERT_TRUE(nav_map); | 506 ASSERT_TRUE(nav_map); |
308 // Since unlike server redirects client redirects commit and then generate a | 507 // Since unlike server redirects client redirects commit and then generate a |
309 // second navigation, our observer records two NavigationEvents for this test. | 508 // second navigation, our observer records two NavigationEvents for this test. |
310 ASSERT_EQ(std::size_t(2), nav_map->size()); | 509 ASSERT_EQ(std::size_t(3), nav_map->size()); |
311 ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size()); | 510 ASSERT_EQ(1U, nav_map->at(redirect_url).size()); |
312 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 511 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 512 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 513 VerifyNavigationEvent(GURL(), // source_url |
| 514 GURL(), // source_main_frame_url |
| 515 initial_url, // original_request_url |
| 516 initial_url, // destination_url |
| 517 true, // is_user_initiated, |
| 518 true, // has_committed |
| 519 false, // has_server_redirect |
| 520 nav_map->at(initial_url).at(0)); |
313 VerifyNavigationEvent(initial_url, // source_url | 521 VerifyNavigationEvent(initial_url, // source_url |
314 initial_url, // source_main_frame_url | 522 initial_url, // source_main_frame_url |
315 redirect_url, // original_request_url | 523 redirect_url, // original_request_url |
316 redirect_url, // destination_url | 524 redirect_url, // destination_url |
317 false, // is_user_initiated, | 525 true, // is_user_initiated, |
318 true, // has_committed | 526 true, // has_committed |
319 false, // has_server_redirect | 527 false, // has_server_redirect |
320 nav_map->at(redirect_url).at(0)); | 528 nav_map->at(redirect_url).at(0)); |
321 VerifyNavigationEvent(redirect_url, // source_url | 529 VerifyNavigationEvent(redirect_url, // source_url |
322 redirect_url, // source_main_frame_url | 530 redirect_url, // source_main_frame_url |
323 download_url, // original_request_url | 531 download_url, // original_request_url |
324 download_url, // destination_url | 532 download_url, // destination_url |
325 false, // is_user_initiated, | 533 false, // is_user_initiated, |
326 false, // has_committed | 534 false, // has_committed |
327 false, // has_server_redirect | 535 false, // has_server_redirect |
328 nav_map->at(download_url).at(0)); | 536 nav_map->at(download_url).at(0)); |
329 VerifyHostToIpMap(); | 537 VerifyHostToIpMap(); |
| 538 |
| 539 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 540 ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
| 541 VerifyReferrerChainEntry(download_url, // url |
| 542 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 543 test_server_ip, // ip_address |
| 544 redirect_url, // referrer_url |
| 545 redirect_url, // referrer_main_frame_url |
| 546 false, // is_retargeting |
| 547 referrer_chain[0]); |
| 548 VerifyReferrerChainEntry(redirect_url, // url |
| 549 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 550 test_server_ip, // ip_address |
| 551 initial_url, // referrer_url |
| 552 initial_url, // referrer_main_frame_url |
| 553 false, // is_retargeting |
| 554 referrer_chain[1]); |
| 555 VerifyReferrerChainEntry(initial_url, // url |
| 556 ReferrerChainEntry::LANDING_PAGE, // type |
| 557 test_server_ip, // ip_address |
| 558 GURL(), // referrer_url |
| 559 GURL(), // referrer_main_frame_url |
| 560 false, // is_retargeting |
| 561 referrer_chain[2]); |
330 } | 562 } |
331 | 563 |
332 // https://crbug.com/667784: The test is flaky on Linux. | 564 // https://crbug.com/667784: The test is flaky on Linux. |
333 #if defined(OS_LINUX) | 565 #if defined(OS_LINUX) |
334 #define MAYBE_SingleMetaRefreshRedirectTargetBlank DISABLED_SingleMetaRefreshRed
irectTargetBlank | 566 #define MAYBE_SingleMetaRefreshRedirectTargetBlank DISABLED_SingleMetaRefreshRed
irectTargetBlank |
335 #else | 567 #else |
336 #define MAYBE_SingleMetaRefreshRedirectTargetBlank SingleMetaRefreshRedirectTarg
etBlank | 568 #define MAYBE_SingleMetaRefreshRedirectTargetBlank SingleMetaRefreshRedirectTarg
etBlank |
337 #endif | 569 #endif |
338 // Click on a link which navigates to a page then redirects to a download using | 570 // Click on a link which navigates to a page then redirects to a download using |
339 // META HTTP-EQUIV="refresh". First navigation happens in target blank. | 571 // META HTTP-EQUIV="refresh". First navigation happens in target blank. |
340 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 572 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
341 MAYBE_SingleMetaRefreshRedirectTargetBlank) { | 573 MAYBE_SingleMetaRefreshRedirectTargetBlank) { |
342 ClickTestLink("single_meta_refresh_redirect_target_blank", 2); | |
343 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 574 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 575 ClickTestLink("single_meta_refresh_redirect_target_blank", 2, initial_url); |
344 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); | 576 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
345 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 577 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 578 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
346 auto nav_map = navigation_map(); | 579 auto nav_map = navigation_map(); |
347 ASSERT_TRUE(nav_map); | 580 ASSERT_TRUE(nav_map); |
348 ASSERT_EQ(std::size_t(2), nav_map->size()); | 581 ASSERT_EQ(std::size_t(3), nav_map->size()); |
349 ASSERT_EQ(std::size_t(2), nav_map->at(redirect_url).size()); | 582 ASSERT_EQ(2U, nav_map->at(redirect_url).size()); |
350 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 583 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 584 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 585 VerifyNavigationEvent(GURL(), // source_url |
| 586 GURL(), // source_main_frame_url |
| 587 initial_url, // original_request_url |
| 588 initial_url, // destination_url |
| 589 true, // is_user_initiated, |
| 590 true, // has_committed |
| 591 false, // has_server_redirect |
| 592 nav_map->at(initial_url).at(0)); |
351 // TODO(jialiul): After https://crbug.com/651895 is fixed, we'll no longer | 593 // TODO(jialiul): After https://crbug.com/651895 is fixed, we'll no longer |
352 // listen to NOTIFICATION_RETARGETING, hence only two NavigationEvents will | 594 // listen to NOTIFICATION_RETARGETING, hence only two NavigationEvents will |
353 // be observed with the true initator URL. | 595 // be observed with the true initator URL. |
354 VerifyNavigationEvent(initial_url, // source_url | 596 VerifyNavigationEvent(initial_url, // source_url |
355 initial_url, // source_main_frame_url | 597 initial_url, // source_main_frame_url |
356 redirect_url, // original_request_url | 598 redirect_url, // original_request_url |
357 redirect_url, // destination_url | 599 redirect_url, // destination_url |
358 false, // is_user_initiated, | 600 true, // is_user_initiated, |
359 false, // has_committed | 601 false, // has_committed |
360 false, // has_server_redirect | 602 false, // has_server_redirect |
361 nav_map->at(redirect_url).at(0)); | 603 nav_map->at(redirect_url).at(0)); |
362 VerifyNavigationEvent(GURL(), // source_url | 604 VerifyNavigationEvent(GURL(), // source_url |
363 GURL(), // source_main_frame_url | 605 GURL(), // source_main_frame_url |
364 redirect_url, // original_request_url | 606 redirect_url, // original_request_url |
365 redirect_url, // destination_url | 607 redirect_url, // destination_url |
366 false, // is_user_initiated, | 608 false, // is_user_initiated, |
367 true, // has_committed | 609 true, // has_committed |
368 false, // has_server_redirect | 610 false, // has_server_redirect |
369 nav_map->at(redirect_url).at(1)); | 611 nav_map->at(redirect_url).at(1)); |
370 VerifyNavigationEvent(redirect_url, // source_url | 612 VerifyNavigationEvent(redirect_url, // source_url |
371 redirect_url, // source_main_frame_url | 613 redirect_url, // source_main_frame_url |
372 download_url, // original_request_url | 614 download_url, // original_request_url |
373 download_url, // destination_url | 615 download_url, // destination_url |
374 false, // is_user_initiated, | 616 false, // is_user_initiated, |
375 false, // has_committed | 617 false, // has_committed |
376 false, // has_server_redirect | 618 false, // has_server_redirect |
377 nav_map->at(download_url).at(0)); | 619 nav_map->at(download_url).at(0)); |
378 VerifyHostToIpMap(); | 620 VerifyHostToIpMap(); |
| 621 |
| 622 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 623 ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
| 624 VerifyReferrerChainEntry(download_url, // url |
| 625 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 626 test_server_ip, // ip_address |
| 627 redirect_url, // referrer_url |
| 628 redirect_url, // referrer_main_frame_url |
| 629 false, // is_retargeting |
| 630 referrer_chain[0]); |
| 631 VerifyReferrerChainEntry(redirect_url, // url |
| 632 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 633 test_server_ip, // ip_address |
| 634 initial_url, // referrer_url |
| 635 initial_url, // referrer_main_frame_url |
| 636 true, // is_retargeting |
| 637 referrer_chain[1]); |
| 638 VerifyReferrerChainEntry(initial_url, // url |
| 639 ReferrerChainEntry::LANDING_PAGE, // type |
| 640 test_server_ip, // ip_address |
| 641 GURL(), // referrer_url |
| 642 GURL(), // referrer_main_frame_url |
| 643 false, // is_retargeting |
| 644 referrer_chain[2]); |
379 } | 645 } |
380 | 646 |
381 // Click on a link which redirects twice before reaching download using | 647 // Click on a link which redirects twice before reaching download using |
382 // META HTTP-EQUIV="refresh". All transitions happen in the same tab. | 648 // META HTTP-EQUIV="refresh". All transitions happen in the same tab. |
383 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 649 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
384 MultiMetaRefreshRedirects) { | 650 MultiMetaRefreshRedirects) { |
385 ClickTestLink("multiple_meta_refresh_redirects", 3); | |
386 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 651 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 652 ClickTestLink("multiple_meta_refresh_redirects", 3, initial_url); |
387 GURL first_redirect_url = embedded_test_server()->GetURL( | 653 GURL first_redirect_url = embedded_test_server()->GetURL( |
388 "/safe_browsing/download_protection/navigation_observer/" | 654 "/safe_browsing/download_protection/navigation_observer/" |
389 "double_redirect.html"); | 655 "double_redirect.html"); |
390 GURL second_redirect_url = embedded_test_server()->GetURL(kRedirectURL); | 656 GURL second_redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
391 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 657 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 658 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
392 auto nav_map = navigation_map(); | 659 auto nav_map = navigation_map(); |
393 ASSERT_TRUE(nav_map); | 660 ASSERT_TRUE(nav_map); |
394 ASSERT_EQ(std::size_t(3), nav_map->size()); | 661 ASSERT_EQ(std::size_t(4), nav_map->size()); |
395 ASSERT_EQ(std::size_t(1), nav_map->at(first_redirect_url).size()); | 662 ASSERT_EQ(1U, nav_map->at(first_redirect_url).size()); |
396 ASSERT_EQ(std::size_t(1), nav_map->at(second_redirect_url).size()); | 663 ASSERT_EQ(1U, nav_map->at(second_redirect_url).size()); |
397 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 664 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 665 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 666 VerifyNavigationEvent(GURL(), // source_url |
| 667 GURL(), // source_main_frame_url |
| 668 initial_url, // original_request_url |
| 669 initial_url, // destination_url |
| 670 true, // is_user_initiated, |
| 671 true, // has_committed |
| 672 false, // has_server_redirect |
| 673 nav_map->at(initial_url).at(0)); |
398 VerifyNavigationEvent(initial_url, // source_url | 674 VerifyNavigationEvent(initial_url, // source_url |
399 initial_url, // source_main_frame_url | 675 initial_url, // source_main_frame_url |
400 first_redirect_url, // original_request_url | 676 first_redirect_url, // original_request_url |
401 first_redirect_url, // destination_url | 677 first_redirect_url, // destination_url |
402 false, // is_user_initiated, | 678 true, // is_user_initiated, |
403 true, // has_committed | 679 true, // has_committed |
404 false, // has_server_redirect | 680 false, // has_server_redirect |
405 nav_map->at(first_redirect_url).at(0)); | 681 nav_map->at(first_redirect_url).at(0)); |
406 VerifyNavigationEvent(first_redirect_url, // source_url | 682 VerifyNavigationEvent(first_redirect_url, // source_url |
407 first_redirect_url, // source_main_frame_url | 683 first_redirect_url, // source_main_frame_url |
408 second_redirect_url, // original_request_url | 684 second_redirect_url, // original_request_url |
409 second_redirect_url, // destination_url | 685 second_redirect_url, // destination_url |
410 false, // is_user_initiated, | 686 false, // is_user_initiated, |
411 true, // has_committed | 687 true, // has_committed |
412 false, // has_server_redirect | 688 false, // has_server_redirect |
413 nav_map->at(second_redirect_url).at(0)); | 689 nav_map->at(second_redirect_url).at(0)); |
414 VerifyNavigationEvent(second_redirect_url, // source_url | 690 VerifyNavigationEvent(second_redirect_url, // source_url |
415 second_redirect_url, // source_main_frame_url | 691 second_redirect_url, // source_main_frame_url |
416 download_url, // original_request_url | 692 download_url, // original_request_url |
417 download_url, // destination_url | 693 download_url, // destination_url |
418 false, // is_user_initiated, | 694 false, // is_user_initiated, |
419 false, // has_committed | 695 false, // has_committed |
420 false, // has_server_redirect | 696 false, // has_server_redirect |
421 nav_map->at(download_url).at(0)); | 697 nav_map->at(download_url).at(0)); |
422 VerifyHostToIpMap(); | 698 VerifyHostToIpMap(); |
| 699 |
| 700 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 701 ASSERT_EQ(std::size_t(4), referrer_chain.size()); |
| 702 VerifyReferrerChainEntry(download_url, // url |
| 703 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 704 test_server_ip, // ip_address |
| 705 second_redirect_url, // referrer_url |
| 706 second_redirect_url, // referrer_main_frame_url |
| 707 false, // is_retargeting |
| 708 referrer_chain[0]); |
| 709 VerifyReferrerChainEntry(second_redirect_url, // url |
| 710 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 711 test_server_ip, // ip_address |
| 712 first_redirect_url, // referrer_url |
| 713 first_redirect_url, // referrer_main_frame_url |
| 714 false, // is_retargeting |
| 715 referrer_chain[1]); |
| 716 VerifyReferrerChainEntry(first_redirect_url, // url |
| 717 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 718 test_server_ip, // ip_address |
| 719 initial_url, // referrer_url |
| 720 initial_url, // referrer_main_frame_url |
| 721 false, // is_retargeting |
| 722 referrer_chain[2]); |
| 723 VerifyReferrerChainEntry(initial_url, // url |
| 724 ReferrerChainEntry::LANDING_PAGE, // type |
| 725 test_server_ip, // ip_address |
| 726 GURL(), // referrer_url |
| 727 GURL(), // referrer_main_frame_url |
| 728 false, // is_retargeting |
| 729 referrer_chain[3]); |
423 } | 730 } |
424 | 731 |
425 // Click on a link which redirects to download using window.location. | 732 // Click on a link which redirects to download using window.location. |
426 // All transitions happen in the same tab. | 733 // All transitions happen in the same tab. |
427 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 734 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
428 WindowLocationRedirect) { | 735 WindowLocationRedirect) { |
429 ClickTestLink("window_location_redirection", 1); | |
430 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 736 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 737 ClickTestLink("window_location_redirection", 1, initial_url); |
431 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 738 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 739 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
432 auto nav_map = navigation_map(); | 740 auto nav_map = navigation_map(); |
433 ASSERT_TRUE(nav_map); | 741 ASSERT_TRUE(nav_map); |
434 ASSERT_EQ(std::size_t(1), nav_map->size()); | 742 ASSERT_EQ(2U, nav_map->size()); |
435 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 743 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 744 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 745 VerifyNavigationEvent(GURL(), // source_url |
| 746 GURL(), // source_main_frame_url |
| 747 initial_url, // original_request_url |
| 748 initial_url, // destination_url |
| 749 true, // is_user_initiated, |
| 750 true, // has_committed |
| 751 false, // has_server_redirect |
| 752 nav_map->at(initial_url).at(0)); |
436 VerifyNavigationEvent(initial_url, // source_url | 753 VerifyNavigationEvent(initial_url, // source_url |
437 initial_url, // source_main_frame_url | 754 initial_url, // source_main_frame_url |
438 download_url, // original_request_url | 755 download_url, // original_request_url |
439 download_url, // destination_url | 756 download_url, // destination_url |
440 false, // is_user_initiated, | 757 true, // is_user_initiated, |
441 false, // has_committed | 758 false, // has_committed |
442 false, // has_server_redirect | 759 false, // has_server_redirect |
443 nav_map->at(download_url).at(0)); | 760 nav_map->at(download_url).at(0)); |
| 761 |
| 762 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 763 ASSERT_EQ(2U, referrer_chain.size()); |
| 764 VerifyReferrerChainEntry(download_url, // url |
| 765 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 766 test_server_ip, // ip_address |
| 767 initial_url, // referrer_url |
| 768 initial_url, // referrer_main_frame_url |
| 769 false, // is_retargeting |
| 770 referrer_chain[0]); |
| 771 VerifyReferrerChainEntry(initial_url, // url |
| 772 ReferrerChainEntry::LANDING_PAGE, // type |
| 773 test_server_ip, // ip_address |
| 774 GURL(), // referrer_url |
| 775 GURL(), // referrer_main_frame_url |
| 776 false, // is_retargeting |
| 777 referrer_chain[1]); |
444 } | 778 } |
445 | 779 |
446 // Click on a link which redirects twice until it reaches download using a | 780 // Click on a link which redirects twice until it reaches download using a |
447 // mixture of meta refresh and window.location. All transitions happen in the | 781 // mixture of meta refresh and window.location. All transitions happen in the |
448 // same tab. | 782 // same tab. |
449 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, MixRedirects) { | 783 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, MixRedirects) { |
450 ClickTestLink("mix_redirects", 2); | 784 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 785 ClickTestLink("mix_redirects", 2, initial_url); |
451 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); | 786 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
452 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | |
453 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 787 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 788 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
454 auto nav_map = navigation_map(); | 789 auto nav_map = navigation_map(); |
455 ASSERT_TRUE(nav_map); | 790 ASSERT_TRUE(nav_map); |
456 ASSERT_EQ(std::size_t(2), nav_map->size()); | 791 ASSERT_EQ(std::size_t(3), nav_map->size()); |
457 ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size()); | 792 ASSERT_EQ(1U, nav_map->at(redirect_url).size()); |
458 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 793 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 794 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 795 VerifyNavigationEvent(GURL(), // source_url |
| 796 GURL(), // source_main_frame_url |
| 797 initial_url, // original_request_url |
| 798 initial_url, // destination_url |
| 799 true, // is_user_initiated, |
| 800 true, // has_committed |
| 801 false, // has_server_redirect |
| 802 nav_map->at(initial_url).at(0)); |
459 VerifyNavigationEvent(initial_url, // source_url | 803 VerifyNavigationEvent(initial_url, // source_url |
460 initial_url, // source_main_frame_url | 804 initial_url, // source_main_frame_url |
461 redirect_url, // original_request_url | 805 redirect_url, // original_request_url |
462 redirect_url, // destination_url | 806 redirect_url, // destination_url |
463 false, // is_user_initiated, | 807 true, // is_user_initiated, |
464 true, // has_committed | 808 true, // has_committed |
465 false, // has_server_redirect | 809 false, // has_server_redirect |
466 nav_map->at(redirect_url).at(0)); | 810 nav_map->at(redirect_url).at(0)); |
467 VerifyNavigationEvent(redirect_url, // source_url | 811 VerifyNavigationEvent(redirect_url, // source_url |
468 redirect_url, // source_main_frame_url | 812 redirect_url, // source_main_frame_url |
469 download_url, // original_request_url | 813 download_url, // original_request_url |
470 download_url, // destination_url | 814 download_url, // destination_url |
471 false, // is_user_initiated, | 815 false, // is_user_initiated, |
472 false, // has_committed | 816 false, // has_committed |
473 false, // has_server_redirect | 817 false, // has_server_redirect |
474 nav_map->at(download_url).at(0)); | 818 nav_map->at(download_url).at(0)); |
475 VerifyHostToIpMap(); | 819 VerifyHostToIpMap(); |
| 820 |
| 821 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 822 ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
| 823 VerifyReferrerChainEntry(download_url, // url |
| 824 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 825 test_server_ip, // ip_address |
| 826 redirect_url, // referrer_url |
| 827 redirect_url, // referrer_main_frame_url |
| 828 false, // is_retargeting |
| 829 referrer_chain[0]); |
| 830 VerifyReferrerChainEntry(redirect_url, // url |
| 831 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 832 test_server_ip, // ip_address |
| 833 initial_url, // referrer_url |
| 834 initial_url, // referrer_main_frame_url |
| 835 false, // is_retargeting |
| 836 referrer_chain[1]); |
| 837 VerifyReferrerChainEntry(initial_url, // url |
| 838 ReferrerChainEntry::LANDING_PAGE, // type |
| 839 test_server_ip, // ip_address |
| 840 GURL(), // referrer_url |
| 841 GURL(), // referrer_main_frame_url |
| 842 false, // is_retargeting |
| 843 referrer_chain[2]); |
476 } | 844 } |
477 | 845 |
478 // Use javascript to open download in a new tab. | 846 // Use javascript to open download in a new tab. |
479 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, NewTabDownload) { | 847 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, NewTabDownload) { |
480 ClickTestLink("new_tab_download", 2); | |
481 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 848 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 849 ClickTestLink("new_tab_download", 2, initial_url); |
482 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 850 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
483 GURL blank_url = GURL(url::kAboutBlankURL); | 851 GURL blank_url = GURL(url::kAboutBlankURL); |
| 852 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
484 auto nav_map = navigation_map(); | 853 auto nav_map = navigation_map(); |
485 ASSERT_TRUE(nav_map); | 854 ASSERT_TRUE(nav_map); |
486 ASSERT_EQ(std::size_t(2), nav_map->size()); | 855 ASSERT_EQ(std::size_t(3), nav_map->size()); |
487 ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); | 856 ASSERT_EQ(2U, nav_map->at(blank_url).size()); |
488 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 857 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 858 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 859 VerifyNavigationEvent(GURL(), // source_url |
| 860 GURL(), // source_main_frame_url |
| 861 initial_url, // original_request_url |
| 862 initial_url, // destination_url |
| 863 true, // is_user_initiated, |
| 864 true, // has_committed |
| 865 false, // has_server_redirect |
| 866 nav_map->at(initial_url).at(0)); |
489 VerifyNavigationEvent(initial_url, // source_url | 867 VerifyNavigationEvent(initial_url, // source_url |
490 initial_url, // source_main_frame_url | 868 initial_url, // source_main_frame_url |
491 blank_url, // original_request_url | 869 blank_url, // original_request_url |
492 blank_url, // destination_url | 870 blank_url, // destination_url |
493 false, // is_user_initiated, | 871 true, // is_user_initiated, |
494 false, // has_committed | 872 false, // has_committed |
495 false, // has_server_redirect | 873 false, // has_server_redirect |
496 nav_map->at(blank_url).at(0)); | 874 nav_map->at(blank_url).at(0)); |
497 // Source and target are at different tabs. | 875 // Source and target are at different tabs. |
498 EXPECT_NE(nav_map->at(blank_url).at(0).source_tab_id, | 876 EXPECT_NE(nav_map->at(blank_url).at(0).source_tab_id, |
499 nav_map->at(blank_url).at(0).target_tab_id); | 877 nav_map->at(blank_url).at(0).target_tab_id); |
500 VerifyNavigationEvent(GURL(), // source_url | 878 VerifyNavigationEvent(GURL(), // source_url |
501 GURL(), // source_main_frame_url | 879 GURL(), // source_main_frame_url |
502 blank_url, // original_request_url | 880 blank_url, // original_request_url |
503 blank_url, // destination_url | 881 blank_url, // destination_url |
504 false, // is_user_initiated, | 882 false, // is_user_initiated, |
505 false, // has_committed | 883 false, // has_committed |
506 false, // has_server_redirect | 884 false, // has_server_redirect |
507 nav_map->at(blank_url).at(1)); | 885 nav_map->at(blank_url).at(1)); |
508 EXPECT_EQ(nav_map->at(blank_url).at(1).source_tab_id, | 886 EXPECT_EQ(nav_map->at(blank_url).at(1).source_tab_id, |
509 nav_map->at(blank_url).at(1).target_tab_id); | 887 nav_map->at(blank_url).at(1).target_tab_id); |
510 VerifyNavigationEvent(blank_url, // source_url | 888 VerifyNavigationEvent(blank_url, // source_url |
511 blank_url, // source_main_frame_url | 889 blank_url, // source_main_frame_url |
512 download_url, // original_request_url | 890 download_url, // original_request_url |
513 download_url, // destination_url | 891 download_url, // destination_url |
514 false, // is_user_initiated, | 892 false, // is_user_initiated, |
515 false, // has_committed | 893 false, // has_committed |
516 false, // has_server_redirect | 894 false, // has_server_redirect |
517 nav_map->at(download_url).at(0)); | 895 nav_map->at(download_url).at(0)); |
518 EXPECT_EQ(nav_map->at(download_url).at(0).source_tab_id, | 896 EXPECT_EQ(nav_map->at(download_url).at(0).source_tab_id, |
519 nav_map->at(download_url).at(0).target_tab_id); | 897 nav_map->at(download_url).at(0).target_tab_id); |
520 VerifyHostToIpMap(); | 898 VerifyHostToIpMap(); |
| 899 |
| 900 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 901 ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
| 902 VerifyReferrerChainEntry(download_url, // url |
| 903 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 904 test_server_ip, // ip_address |
| 905 blank_url, // referrer_url |
| 906 blank_url, // referrer_main_frame_url |
| 907 false, // is_retargeting |
| 908 referrer_chain[0]); |
| 909 VerifyReferrerChainEntry(blank_url, // url |
| 910 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 911 "", // ip_address |
| 912 initial_url, // referrer_url |
| 913 initial_url, // referrer_main_frame_url |
| 914 true, // is_retargeting |
| 915 referrer_chain[1]); |
| 916 VerifyReferrerChainEntry(initial_url, // url |
| 917 ReferrerChainEntry::LANDING_PAGE, // type |
| 918 test_server_ip, // ip_address |
| 919 GURL(), // referrer_url |
| 920 GURL(), // referrer_main_frame_url |
| 921 false, // is_retargeting |
| 922 referrer_chain[2]); |
521 } | 923 } |
522 | 924 |
523 // Use javascript to open download in a new tab and download has a data url. | 925 // Use javascript to open download in a new tab and download has a data url. |
524 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 926 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
525 NewTabDownloadWithDataURL) { | 927 NewTabDownloadWithDataURL) { |
526 ClickTestLink("new_tab_download_with_data_url", 2); | |
527 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 928 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 929 ClickTestLink("new_tab_download_with_data_url", 2, initial_url); |
528 GURL download_url = GURL(kDownloadDataURL); | 930 GURL download_url = GURL(kDownloadDataURL); |
529 GURL blank_url = GURL("about:blank"); | 931 GURL blank_url = GURL(url::kAboutBlankURL); |
| 932 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
530 auto nav_map = navigation_map(); | 933 auto nav_map = navigation_map(); |
531 ASSERT_TRUE(nav_map); | 934 ASSERT_TRUE(nav_map); |
532 ASSERT_EQ(std::size_t(2), nav_map->size()); | 935 ASSERT_EQ(std::size_t(3), nav_map->size()); |
533 ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); | 936 ASSERT_EQ(2U, nav_map->at(blank_url).size()); |
534 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 937 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 938 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 939 VerifyNavigationEvent(GURL(), // source_url |
| 940 GURL(), // source_main_frame_url |
| 941 initial_url, // original_request_url |
| 942 initial_url, // destination_url |
| 943 true, // is_user_initiated, |
| 944 true, // has_committed |
| 945 false, // has_server_redirect |
| 946 nav_map->at(initial_url).at(0)); |
535 // The first one comes from NOTIFICATION_RETARGETING. | 947 // The first one comes from NOTIFICATION_RETARGETING. |
536 VerifyNavigationEvent(initial_url, // source_url | 948 VerifyNavigationEvent(initial_url, // source_url |
537 initial_url, // source_main_frame_url | 949 initial_url, // source_main_frame_url |
538 blank_url, // original_request_url | 950 blank_url, // original_request_url |
539 blank_url, // destination_url | 951 blank_url, // destination_url |
540 false, // is_user_initiated, | 952 true, // is_user_initiated, |
541 false, // has_committed | 953 false, // has_committed |
542 false, // has_server_redirect | 954 false, // has_server_redirect |
543 nav_map->at(blank_url).at(0)); | 955 nav_map->at(blank_url).at(0)); |
544 // Source and target are at different tabs. | 956 // Source and target are at different tabs. |
545 EXPECT_FALSE(nav_map->at(blank_url).at(0).source_tab_id == | 957 EXPECT_FALSE(nav_map->at(blank_url).at(0).source_tab_id == |
546 nav_map->at(blank_url).at(0).target_tab_id); | 958 nav_map->at(blank_url).at(0).target_tab_id); |
547 VerifyNavigationEvent(GURL(), // source_url | 959 VerifyNavigationEvent(GURL(), // source_url |
548 GURL(), // source_main_frame_url | 960 GURL(), // source_main_frame_url |
549 blank_url, // original_request_url | 961 blank_url, // original_request_url |
550 blank_url, // destination_url | 962 blank_url, // destination_url |
551 false, // is_user_initiated, | 963 false, // is_user_initiated, |
552 false, // has_committed | 964 false, // has_committed |
553 false, // has_server_redirect | 965 false, // has_server_redirect |
554 nav_map->at(blank_url).at(1)); | 966 nav_map->at(blank_url).at(1)); |
555 EXPECT_EQ(nav_map->at(blank_url).at(1).source_tab_id, | 967 EXPECT_EQ(nav_map->at(blank_url).at(1).source_tab_id, |
556 nav_map->at(blank_url).at(1).target_tab_id); | 968 nav_map->at(blank_url).at(1).target_tab_id); |
557 VerifyNavigationEvent(blank_url, // source_url | 969 VerifyNavigationEvent(blank_url, // source_url |
558 blank_url, // source_main_frame_url | 970 blank_url, // source_main_frame_url |
559 download_url, // original_request_url | 971 download_url, // original_request_url |
560 download_url, // destination_url | 972 download_url, // destination_url |
561 false, // is_user_initiated, | 973 false, // is_user_initiated, |
562 false, // has_committed | 974 false, // has_committed |
563 false, // has_server_redirect | 975 false, // has_server_redirect |
564 nav_map->at(download_url).at(0)); | 976 nav_map->at(download_url).at(0)); |
565 EXPECT_TRUE(nav_map->at(download_url).at(0).source_tab_id == | 977 EXPECT_TRUE(nav_map->at(download_url).at(0).source_tab_id == |
566 nav_map->at(download_url).at(0).target_tab_id); | 978 nav_map->at(download_url).at(0).target_tab_id); |
567 // Since data url does does not have IP, host_to_ip_map_ should be empty. | 979 VerifyHostToIpMap(); |
568 EXPECT_EQ(std::size_t(0), host_to_ip_map()->size()); | 980 |
| 981 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 982 ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
| 983 VerifyReferrerChainEntry(download_url, // url |
| 984 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 985 "", // ip_address |
| 986 blank_url, // referrer_url |
| 987 blank_url, // referrer_main_frame_url |
| 988 false, // is_retargeting |
| 989 referrer_chain[0]); |
| 990 VerifyReferrerChainEntry(blank_url, // url |
| 991 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 992 "", // ip_address |
| 993 initial_url, // referrer_url |
| 994 initial_url, // referrer_main_frame_url |
| 995 true, // is_retargeting |
| 996 referrer_chain[1]); |
| 997 VerifyReferrerChainEntry(initial_url, // url |
| 998 ReferrerChainEntry::LANDING_PAGE, // type |
| 999 test_server_ip, // ip_address |
| 1000 GURL(), // referrer_url |
| 1001 GURL(), // referrer_main_frame_url |
| 1002 false, // is_retargeting |
| 1003 referrer_chain[2]); |
569 } | 1004 } |
570 | 1005 |
571 // TODO(jialiul): Need to figure out why this test is failing on Windows and | 1006 // TODO(jialiul): Need to figure out why this test is failing on Windows and |
572 // flaky on other platforms. | 1007 // flaky on other platforms. |
573 #define MAYBE_DownloadViaHTML5FileApi DISABLED_DownloadViaHTML5FileApi | 1008 #define MAYBE_DownloadViaHTML5FileApi DISABLED_DownloadViaHTML5FileApi |
574 // Download via html5 file API. | 1009 // Download via html5 file API. |
575 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 1010 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
576 MAYBE_DownloadViaHTML5FileApi) { | 1011 MAYBE_DownloadViaHTML5FileApi) { |
577 ClickTestLink("html5_file_api", 1); | |
578 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 1012 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 1013 ClickTestLink("html5_file_api", 1, initial_url); |
579 std::string download_url_str = | 1014 std::string download_url_str = |
580 base::StringPrintf("filesystem:%stemporary/test.exe", | 1015 base::StringPrintf("filesystem:%stemporary/test.exe", |
581 embedded_test_server()->base_url().spec().c_str()); | 1016 embedded_test_server()->base_url().spec().c_str()); |
582 GURL download_url = GURL(download_url_str); | 1017 GURL download_url = GURL(download_url_str); |
| 1018 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
583 auto nav_map = navigation_map(); | 1019 auto nav_map = navigation_map(); |
584 ASSERT_TRUE(nav_map); | 1020 ASSERT_TRUE(nav_map); |
585 ASSERT_EQ(std::size_t(1), nav_map->size()); | 1021 ASSERT_EQ(2U, nav_map->size()); |
586 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 1022 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 1023 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 1024 VerifyNavigationEvent(GURL(), // source_url |
| 1025 GURL(), // source_main_frame_url |
| 1026 initial_url, // original_request_url |
| 1027 initial_url, // destination_url |
| 1028 true, // is_user_initiated, |
| 1029 true, // has_committed |
| 1030 false, // has_server_redirect |
| 1031 nav_map->at(initial_url).at(0)); |
587 VerifyNavigationEvent(initial_url, // source_url | 1032 VerifyNavigationEvent(initial_url, // source_url |
588 initial_url, // source_main_frame_url | 1033 initial_url, // source_main_frame_url |
589 download_url, // original_request_url | 1034 download_url, // original_request_url |
590 download_url, // destination_url | 1035 download_url, // destination_url |
591 false, // is_user_initiated, | 1036 true, // is_user_initiated, |
592 false, // has_committed | 1037 false, // has_committed |
593 false, // has_server_redirect | 1038 false, // has_server_redirect |
594 nav_map->at(download_url).at(0)); | 1039 nav_map->at(download_url).at(0)); |
595 VerifyHostToIpMap(); | 1040 VerifyHostToIpMap(); |
| 1041 |
| 1042 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 1043 ASSERT_EQ(2U, referrer_chain.size()); |
| 1044 VerifyReferrerChainEntry(download_url, // url |
| 1045 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 1046 "", // ip_address |
| 1047 initial_url, // referrer_url |
| 1048 initial_url, // referrer_main_frame_url |
| 1049 false, // is_retargeting |
| 1050 referrer_chain[0]); |
| 1051 VerifyReferrerChainEntry(initial_url, // url |
| 1052 ReferrerChainEntry::LANDING_PAGE, // type |
| 1053 test_server_ip, // ip_address |
| 1054 GURL(), // referrer_url |
| 1055 GURL(), // referrer_main_frame_url |
| 1056 false, // is_retargeting |
| 1057 referrer_chain[1]); |
596 } | 1058 } |
597 | 1059 |
598 // Click a link in a subframe and start download. | 1060 // Click a link in a subframe and start download. |
599 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 1061 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
600 SubFrameDirectDownload) { | 1062 SubFrameDirectDownload) { |
601 ui_test_utils::NavigateToURL( | 1063 ui_test_utils::NavigateToURL( |
602 browser(), embedded_test_server()->GetURL(kMultiFrameTestURL)); | 1064 browser(), embedded_test_server()->GetURL(kMultiFrameTestURL)); |
603 std::string test_name = | 1065 std::string test_name = |
604 base::StringPrintf("%s', '%s", "iframe1", "iframe_direct_download"); | 1066 base::StringPrintf("%s', '%s", "iframe1", "iframe_direct_download"); |
605 ClickTestLink(test_name.c_str(), 1); | |
606 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 1067 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
607 GURL multi_frame_test_url = | 1068 GURL multi_frame_test_url = |
608 embedded_test_server()->GetURL(kMultiFrameTestURL); | 1069 embedded_test_server()->GetURL(kMultiFrameTestURL); |
609 GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL); | 1070 GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL); |
| 1071 ClickTestLink(test_name.c_str(), 1, iframe_url); |
610 GURL iframe_retargeting_url = | 1072 GURL iframe_retargeting_url = |
611 embedded_test_server()->GetURL(kIframeRetargetingURL); | 1073 embedded_test_server()->GetURL(kIframeRetargetingURL); |
612 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 1074 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 1075 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
613 auto nav_map = navigation_map(); | 1076 auto nav_map = navigation_map(); |
614 ASSERT_TRUE(nav_map); | 1077 ASSERT_TRUE(nav_map); |
615 ASSERT_EQ(std::size_t(4), nav_map->size()); | 1078 ASSERT_EQ(std::size_t(5), nav_map->size()); |
616 ASSERT_EQ(std::size_t(1), nav_map->at(multi_frame_test_url).size()); | 1079 ASSERT_EQ(1U, nav_map->at(multi_frame_test_url).size()); |
617 ASSERT_EQ(std::size_t(1), nav_map->at(iframe_url).size()); | 1080 ASSERT_EQ(1U, nav_map->at(iframe_url).size()); |
618 ASSERT_EQ(std::size_t(1), nav_map->at(iframe_retargeting_url).size()); | 1081 ASSERT_EQ(1U, nav_map->at(iframe_retargeting_url).size()); |
619 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 1082 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
620 VerifyNavigationEvent(initial_url, // source_url | 1083 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
621 initial_url, // source_main_frame_url | 1084 VerifyNavigationEvent(GURL(), // source_url |
| 1085 GURL(), // source_main_frame_url |
| 1086 initial_url, // original_request_url |
| 1087 initial_url, // destination_url |
| 1088 true, // is_user_initiated, |
| 1089 true, // has_committed |
| 1090 false, // has_server_redirect |
| 1091 nav_map->at(initial_url).at(0)); |
| 1092 VerifyNavigationEvent(GURL(), // source_url |
| 1093 GURL(), // source_main_frame_url |
622 multi_frame_test_url, // original_request_url | 1094 multi_frame_test_url, // original_request_url |
623 multi_frame_test_url, // destination_url | 1095 multi_frame_test_url, // destination_url |
624 true, // is_user_initiated, | 1096 true, // is_user_initiated, |
625 true, // has_committed | 1097 true, // has_committed |
626 false, // has_server_redirect | 1098 false, // has_server_redirect |
627 nav_map->at(multi_frame_test_url).at(0)); | 1099 nav_map->at(multi_frame_test_url).at(0)); |
628 VerifyNavigationEvent(GURL(), // source_url | 1100 VerifyNavigationEvent(GURL(), // source_url |
629 multi_frame_test_url, // source_main_frame_url | 1101 multi_frame_test_url, // source_main_frame_url |
630 iframe_url, // original_request_url | 1102 iframe_url, // original_request_url |
631 iframe_url, // destination_url | 1103 iframe_url, // destination_url |
632 false, // is_user_initiated, | 1104 false, // is_user_initiated, |
633 true, // has_committed | 1105 true, // has_committed |
634 false, // has_server_redirect | 1106 false, // has_server_redirect |
635 nav_map->at(iframe_url).at(0)); | 1107 nav_map->at(iframe_url).at(0)); |
636 VerifyNavigationEvent(GURL(), // source_url | 1108 VerifyNavigationEvent(GURL(), // source_url |
637 multi_frame_test_url, // source_main_frame_url | 1109 multi_frame_test_url, // source_main_frame_url |
638 iframe_retargeting_url, // original_request_url | 1110 iframe_retargeting_url, // original_request_url |
639 iframe_retargeting_url, // destination_url | 1111 iframe_retargeting_url, // destination_url |
640 false, // is_user_initiated, | 1112 false, // is_user_initiated, |
641 true, // has_committed | 1113 true, // has_committed |
642 false, // has_server_redirect | 1114 false, // has_server_redirect |
643 nav_map->at(iframe_retargeting_url).at(0)); | 1115 nav_map->at(iframe_retargeting_url).at(0)); |
644 VerifyNavigationEvent(iframe_url, // source_url | 1116 VerifyNavigationEvent(iframe_url, // source_url |
645 multi_frame_test_url, // source_main_frame_url | 1117 multi_frame_test_url, // source_main_frame_url |
646 download_url, // original_request_url | 1118 download_url, // original_request_url |
647 download_url, // destination_url | 1119 download_url, // destination_url |
648 false, // is_user_initiated, | 1120 true, // is_user_initiated, |
649 false, // has_committed | 1121 false, // has_committed |
650 false, // has_server_redirect | 1122 false, // has_server_redirect |
651 nav_map->at(download_url).at(0)); | 1123 nav_map->at(download_url).at(0)); |
652 VerifyHostToIpMap(); | 1124 VerifyHostToIpMap(); |
| 1125 |
| 1126 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 1127 ASSERT_EQ(2U, referrer_chain.size()); |
| 1128 VerifyReferrerChainEntry(download_url, // url |
| 1129 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 1130 test_server_ip, // ip_address |
| 1131 iframe_url, // referrer_url |
| 1132 multi_frame_test_url, // referrer_main_frame_url |
| 1133 false, // is_retargeting |
| 1134 referrer_chain[0]); |
| 1135 VerifyReferrerChainEntry(iframe_url, // url |
| 1136 ReferrerChainEntry::LANDING_PAGE, // type |
| 1137 test_server_ip, // ip_address |
| 1138 GURL(), // referrer_url |
| 1139 multi_frame_test_url, // referrer_main_frame_url |
| 1140 false, // is_retargeting |
| 1141 referrer_chain[1]); |
653 } | 1142 } |
654 | 1143 |
655 // Click a link in a subframe and open download in a new tab. | 1144 // Click a link in a subframe and open download in a new tab. |
656 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 1145 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
657 SubFrameNewTabDownload) { | 1146 SubFrameNewTabDownload) { |
658 ui_test_utils::NavigateToURL( | 1147 ui_test_utils::NavigateToURL( |
659 browser(), embedded_test_server()->GetURL(kMultiFrameTestURL)); | 1148 browser(), embedded_test_server()->GetURL(kMultiFrameTestURL)); |
660 std::string test_name = | 1149 std::string test_name = |
661 base::StringPrintf("%s', '%s", "iframe2", "iframe_new_tab_download"); | 1150 base::StringPrintf("%s', '%s", "iframe2", "iframe_new_tab_download"); |
662 ClickTestLink(test_name.c_str(), 2); | |
663 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 1151 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
664 GURL multi_frame_test_url = | 1152 GURL multi_frame_test_url = |
665 embedded_test_server()->GetURL(kMultiFrameTestURL); | 1153 embedded_test_server()->GetURL(kMultiFrameTestURL); |
666 GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL); | 1154 GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL); |
667 GURL iframe_retargeting_url = | 1155 GURL iframe_retargeting_url = |
668 embedded_test_server()->GetURL(kIframeRetargetingURL); | 1156 embedded_test_server()->GetURL(kIframeRetargetingURL); |
| 1157 ClickTestLink(test_name.c_str(), 2, iframe_retargeting_url); |
669 GURL blank_url = GURL(url::kAboutBlankURL); | 1158 GURL blank_url = GURL(url::kAboutBlankURL); |
670 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 1159 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 1160 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
671 auto nav_map = navigation_map(); | 1161 auto nav_map = navigation_map(); |
672 ASSERT_TRUE(nav_map); | 1162 ASSERT_TRUE(nav_map); |
673 ASSERT_EQ(std::size_t(5), nav_map->size()); | 1163 ASSERT_EQ(std::size_t(6), nav_map->size()); |
674 ASSERT_EQ(std::size_t(1), nav_map->at(multi_frame_test_url).size()); | 1164 ASSERT_EQ(1U, nav_map->at(multi_frame_test_url).size()); |
675 ASSERT_EQ(std::size_t(1), nav_map->at(iframe_url).size()); | 1165 ASSERT_EQ(1U, nav_map->at(iframe_url).size()); |
676 ASSERT_EQ(std::size_t(1), nav_map->at(iframe_retargeting_url).size()); | 1166 ASSERT_EQ(1U, nav_map->at(iframe_retargeting_url).size()); |
677 ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); | 1167 ASSERT_EQ(2U, nav_map->at(blank_url).size()); |
678 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 1168 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
679 VerifyNavigationEvent(initial_url, // source_url | 1169 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
680 initial_url, // source_main_frame_url | 1170 VerifyNavigationEvent(GURL(), // source_url |
| 1171 GURL(), // source_main_frame_url |
| 1172 initial_url, // original_request_url |
| 1173 initial_url, // destination_url |
| 1174 true, // is_user_initiated, |
| 1175 true, // has_committed |
| 1176 false, // has_server_redirect |
| 1177 nav_map->at(initial_url).at(0)); |
| 1178 VerifyNavigationEvent(GURL(), // source_url |
| 1179 GURL(), // source_main_frame_url |
681 multi_frame_test_url, // original_request_url | 1180 multi_frame_test_url, // original_request_url |
682 multi_frame_test_url, // destination_url | 1181 multi_frame_test_url, // destination_url |
683 true, // is_user_initiated, | 1182 true, // is_user_initiated, |
684 true, // has_committed | 1183 true, // has_committed |
685 false, // has_server_redirect | 1184 false, // has_server_redirect |
686 nav_map->at(multi_frame_test_url).at(0)); | 1185 nav_map->at(multi_frame_test_url).at(0)); |
687 VerifyNavigationEvent(GURL(), // source_url | 1186 VerifyNavigationEvent(GURL(), // source_url |
688 multi_frame_test_url, // source_main_frame_url | 1187 multi_frame_test_url, // source_main_frame_url |
689 iframe_url, // original_request_url | 1188 iframe_url, // original_request_url |
690 iframe_url, // destination_url | 1189 iframe_url, // destination_url |
691 false, // is_user_initiated, | 1190 false, // is_user_initiated, |
692 true, // has_committed | 1191 true, // has_committed |
693 false, // has_server_redirect | 1192 false, // has_server_redirect |
694 nav_map->at(iframe_url).at(0)); | 1193 nav_map->at(iframe_url).at(0)); |
695 VerifyNavigationEvent(GURL(), // source_url | 1194 VerifyNavigationEvent(GURL(), // source_url |
696 multi_frame_test_url, // source_main_frame_url | 1195 multi_frame_test_url, // source_main_frame_url |
697 iframe_retargeting_url, // original_request_url | 1196 iframe_retargeting_url, // original_request_url |
698 iframe_retargeting_url, // destination_url | 1197 iframe_retargeting_url, // destination_url |
699 false, // is_user_initiated, | 1198 false, // is_user_initiated, |
700 true, // has_committed | 1199 true, // has_committed |
701 false, // has_server_redirect | 1200 false, // has_server_redirect |
702 nav_map->at(iframe_retargeting_url).at(0)); | 1201 nav_map->at(iframe_retargeting_url).at(0)); |
703 VerifyNavigationEvent(iframe_retargeting_url, // source_url | 1202 VerifyNavigationEvent(iframe_retargeting_url, // source_url |
704 multi_frame_test_url, // source_main_frame_url | 1203 multi_frame_test_url, // source_main_frame_url |
705 blank_url, // original_request_url | 1204 blank_url, // original_request_url |
706 blank_url, // destination_url | 1205 blank_url, // destination_url |
707 false, // is_user_initiated, | 1206 true, // is_user_initiated, |
708 false, // has_committed | 1207 false, // has_committed |
709 false, // has_server_redirect | 1208 false, // has_server_redirect |
710 nav_map->at(blank_url).at(0)); | 1209 nav_map->at(blank_url).at(0)); |
711 VerifyNavigationEvent(GURL(), // source_url | 1210 VerifyNavigationEvent(GURL(), // source_url |
712 GURL(), // source_main_frame_url | 1211 GURL(), // source_main_frame_url |
713 blank_url, // original_request_url | 1212 blank_url, // original_request_url |
714 blank_url, // destination_url | 1213 blank_url, // destination_url |
715 false, // is_user_initiated, | 1214 false, // is_user_initiated, |
716 false, // has_committed | 1215 false, // has_committed |
717 false, // has_server_redirect | 1216 false, // has_server_redirect |
718 nav_map->at(blank_url).at(1)); | 1217 nav_map->at(blank_url).at(1)); |
719 VerifyNavigationEvent(blank_url, // source_url | 1218 VerifyNavigationEvent(blank_url, // source_url |
720 blank_url, // source_main_frame_url | 1219 blank_url, // source_main_frame_url |
721 download_url, // original_request_url | 1220 download_url, // original_request_url |
722 download_url, // destination_url | 1221 download_url, // destination_url |
723 false, // is_user_initiated, | 1222 false, // is_user_initiated, |
724 false, // has_committed | 1223 false, // has_committed |
725 false, // has_server_redirect | 1224 false, // has_server_redirect |
726 nav_map->at(download_url).at(0)); | 1225 nav_map->at(download_url).at(0)); |
727 VerifyHostToIpMap(); | 1226 VerifyHostToIpMap(); |
| 1227 |
| 1228 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 1229 EXPECT_EQ(std::size_t(3), referrer_chain.size()); |
| 1230 VerifyReferrerChainEntry(download_url, // url |
| 1231 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 1232 test_server_ip, // ip_address |
| 1233 blank_url, // referrer_url |
| 1234 blank_url, // referrer_main_frame_url |
| 1235 false, // is_retargeting |
| 1236 referrer_chain[0]); |
| 1237 VerifyReferrerChainEntry(blank_url, // url |
| 1238 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 1239 "", // ip_address |
| 1240 iframe_retargeting_url, // referrer_url |
| 1241 multi_frame_test_url, // referrer_main_frame_url |
| 1242 true, // is_retargeting |
| 1243 referrer_chain[1]); |
| 1244 VerifyReferrerChainEntry(iframe_retargeting_url, // url |
| 1245 ReferrerChainEntry::LANDING_PAGE, // type |
| 1246 test_server_ip, // ip_address |
| 1247 GURL(), // referrer_url |
| 1248 multi_frame_test_url, // referrer_main_frame_url |
| 1249 false, // is_retargeting |
| 1250 referrer_chain[2]); |
728 } | 1251 } |
729 | 1252 |
| 1253 // Click a link which redirects to the landing page, and then click on the |
| 1254 // landing page to trigger download. |
| 1255 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, CompleteReferrerChain) { |
| 1256 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 1257 ClickTestLink("complete_referrer_chain", 2, initial_url); |
| 1258 GURL redirect_url = embedded_test_server()->GetURL(kRedirectToLandingURL); |
| 1259 GURL landing_url = embedded_test_server()->GetURL(kLandingURL); |
| 1260 ClickTestLink("download_on_landing_page", 1, landing_url); |
| 1261 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 1262 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
| 1263 auto nav_map = navigation_map(); |
| 1264 ASSERT_TRUE(nav_map); |
| 1265 ASSERT_EQ(std::size_t(4), nav_map->size()); |
| 1266 ASSERT_EQ(1U, nav_map->at(redirect_url).size()); |
| 1267 ASSERT_EQ(1U, nav_map->at(landing_url).size()); |
| 1268 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 1269 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 1270 VerifyNavigationEvent(GURL(), // source_url |
| 1271 GURL(), // source_main_frame_url |
| 1272 initial_url, // original_request_url |
| 1273 initial_url, // destination_url |
| 1274 true, // is_user_initiated, |
| 1275 true, // has_committed |
| 1276 false, // has_server_redirect |
| 1277 nav_map->at(initial_url).at(0)); |
| 1278 VerifyNavigationEvent(initial_url, // source_url |
| 1279 initial_url, // source_main_frame_url |
| 1280 redirect_url, // original_request_url |
| 1281 redirect_url, // destination_url |
| 1282 true, // is_user_initiated, |
| 1283 true, // has_committed |
| 1284 false, // has_server_redirect |
| 1285 nav_map->at(redirect_url).at(0)); |
| 1286 VerifyNavigationEvent(redirect_url, // source_url |
| 1287 redirect_url, // source_main_frame_url |
| 1288 landing_url, // original_request_url |
| 1289 landing_url, // destination_url |
| 1290 false, // is_user_initiated, |
| 1291 true, // has_committed |
| 1292 false, // has_server_redirect |
| 1293 nav_map->at(landing_url).at(0)); |
| 1294 VerifyNavigationEvent(landing_url, // source_url |
| 1295 landing_url, // source_main_frame_url |
| 1296 download_url, // original_request_url |
| 1297 download_url, // destination_url |
| 1298 true, // is_user_initiated, |
| 1299 false, // has_committed |
| 1300 false, // has_server_redirect |
| 1301 nav_map->at(download_url).at(0)); |
| 1302 VerifyHostToIpMap(); |
| 1303 |
| 1304 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 1305 EXPECT_EQ(std::size_t(4), referrer_chain.size()); |
| 1306 VerifyReferrerChainEntry(download_url, // url |
| 1307 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 1308 test_server_ip, // ip_address |
| 1309 landing_url, // referrer_url |
| 1310 landing_url, // referrer_main_frame_url |
| 1311 false, // is_retargeting |
| 1312 referrer_chain[0]); |
| 1313 VerifyReferrerChainEntry(landing_url, // url |
| 1314 ReferrerChainEntry::LANDING_PAGE, // type |
| 1315 test_server_ip, // ip_address |
| 1316 redirect_url, // referrer_url |
| 1317 redirect_url, // referrer_main_frame_url |
| 1318 false, // is_retargeting |
| 1319 referrer_chain[1]); |
| 1320 VerifyReferrerChainEntry(redirect_url, // url |
| 1321 ReferrerChainEntry::CLIENT_REDIRECT, // type |
| 1322 test_server_ip, // ip_address |
| 1323 initial_url, // referrer_url |
| 1324 initial_url, // referrer_main_frame_url |
| 1325 false, // is_retargeting |
| 1326 referrer_chain[2]); |
| 1327 VerifyReferrerChainEntry( |
| 1328 initial_url, // url |
| 1329 ReferrerChainEntry::LANDING_REFERRER, // type |
| 1330 test_server_ip, // ip_address |
| 1331 GURL(), // referrer_url is empty since this beyonds 2 clicks. |
| 1332 GURL(), // referrer_main_frame_url is empty for the same reason. |
| 1333 false, // is_retargeting |
| 1334 referrer_chain[3]); |
| 1335 } |
| 1336 |
| 1337 // Click three links before reaching download. |
| 1338 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
| 1339 ReferrerAttributionWithinTwoUserGestures) { |
| 1340 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
| 1341 ClickTestLink("attribution_within_two_user_gestures", 1, initial_url); |
| 1342 GURL page_before_landing_referrer_url = |
| 1343 embedded_test_server()->GetURL(kPageBeforeLandingReferrerURL); |
| 1344 ClickTestLink("link_to_landing_referrer", 1, |
| 1345 page_before_landing_referrer_url); |
| 1346 GURL landing_referrer_url = |
| 1347 embedded_test_server()->GetURL(kLandingReferrerURL); |
| 1348 ClickTestLink("link_to_landing", 1, landing_referrer_url); |
| 1349 GURL landing_url = embedded_test_server()->GetURL(kLandingURL); |
| 1350 ClickTestLink("download_on_landing_page", 1, landing_url); |
| 1351 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
| 1352 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
| 1353 auto nav_map = navigation_map(); |
| 1354 ASSERT_TRUE(nav_map); |
| 1355 ASSERT_EQ(std::size_t(5), nav_map->size()); |
| 1356 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
| 1357 ASSERT_EQ(1U, nav_map->at(page_before_landing_referrer_url).size()); |
| 1358 ASSERT_EQ(1U, nav_map->at(landing_referrer_url).size()); |
| 1359 ASSERT_EQ(1U, nav_map->at(landing_url).size()); |
| 1360 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
| 1361 VerifyNavigationEvent(GURL(), // source_url |
| 1362 GURL(), // source_main_frame_url |
| 1363 initial_url, // original_request_url |
| 1364 initial_url, // destination_url |
| 1365 true, // is_user_initiated, |
| 1366 true, // has_committed |
| 1367 false, // has_server_redirect |
| 1368 nav_map->at(initial_url).at(0)); |
| 1369 VerifyNavigationEvent(initial_url, // source_url |
| 1370 initial_url, // source_main_frame_url |
| 1371 page_before_landing_referrer_url, // original_request |
| 1372 page_before_landing_referrer_url, // destination_url |
| 1373 true, // is_user_initiated, |
| 1374 true, // has_committed |
| 1375 false, // has_server_redirect |
| 1376 nav_map->at(page_before_landing_referrer_url).at(0)); |
| 1377 VerifyNavigationEvent(page_before_landing_referrer_url, // source_url |
| 1378 page_before_landing_referrer_url, // source_main_frame |
| 1379 landing_referrer_url, // original_request_url |
| 1380 landing_referrer_url, // destination_url |
| 1381 true, // is_user_initiated, |
| 1382 true, // has_committed |
| 1383 false, // has_server_redirect |
| 1384 nav_map->at(landing_referrer_url).at(0)); |
| 1385 VerifyNavigationEvent(landing_referrer_url, // source_url |
| 1386 landing_referrer_url, // source_main_frame |
| 1387 landing_url, // original_request_url |
| 1388 landing_url, // destination_url |
| 1389 true, // is_user_initiated, |
| 1390 true, // has_committed |
| 1391 false, // has_server_redirect |
| 1392 nav_map->at(landing_url).at(0)); |
| 1393 VerifyNavigationEvent(landing_url, // source_url |
| 1394 landing_url, // source_main_frame_url |
| 1395 download_url, // original_request_url |
| 1396 download_url, // destination_url |
| 1397 true, // is_user_initiated, |
| 1398 false, // has_committed |
| 1399 false, // has_server_redirect |
| 1400 nav_map->at(download_url).at(0)); |
| 1401 VerifyHostToIpMap(); |
| 1402 |
| 1403 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 1404 EXPECT_EQ(std::size_t(3), referrer_chain.size()); |
| 1405 VerifyReferrerChainEntry(download_url, // url |
| 1406 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 1407 test_server_ip, // ip_address |
| 1408 landing_url, // referrer_url |
| 1409 landing_url, // referrer_main_frame_url |
| 1410 false, // is_retargeting |
| 1411 referrer_chain[0]); |
| 1412 VerifyReferrerChainEntry(landing_url, // url |
| 1413 ReferrerChainEntry::LANDING_PAGE, // type |
| 1414 test_server_ip, // ip_address |
| 1415 landing_referrer_url, // referrer_url |
| 1416 landing_referrer_url, // referrer_main_frame_url |
| 1417 false, // is_retargeting |
| 1418 referrer_chain[1]); |
| 1419 VerifyReferrerChainEntry( |
| 1420 landing_referrer_url, // url |
| 1421 ReferrerChainEntry::LANDING_REFERRER, // type |
| 1422 test_server_ip, // ip_address |
| 1423 GURL(), // referrer_url is empty since this beyonds 2 clicks. |
| 1424 GURL(), // referrer_main_frame_url is empty for the same reason. |
| 1425 false, // is_retargeting |
| 1426 referrer_chain[2]); |
| 1427 // page_before_landing_referrer_url is not in referrer chain. |
| 1428 } |
| 1429 |
730 // Server-side redirect. | 1430 // Server-side redirect. |
731 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, ServerRedirect) { | 1431 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, ServerRedirect) { |
732 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 1432 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
733 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 1433 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
734 GURL request_url = | 1434 GURL request_url = |
735 embedded_test_server()->GetURL("/server-redirect?" + download_url.spec()); | 1435 embedded_test_server()->GetURL("/server-redirect?" + download_url.spec()); |
736 ui_test_utils::NavigateToURL(browser(), request_url); | 1436 ui_test_utils::NavigateToURL(browser(), request_url); |
737 CancelDownloads(); | 1437 std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
738 auto nav_map = navigation_map(); | 1438 auto nav_map = navigation_map(); |
739 ASSERT_TRUE(nav_map); | 1439 ASSERT_TRUE(nav_map); |
740 ASSERT_EQ(std::size_t(1), nav_map->size()); | 1440 ASSERT_EQ(2U, nav_map->size()); |
741 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 1441 ASSERT_EQ(1U, nav_map->at(download_url).size()); |
742 VerifyNavigationEvent(initial_url, // source_url | 1442 ASSERT_EQ(1U, nav_map->at(initial_url).size()); |
743 initial_url, // source_main_frame_url | 1443 VerifyNavigationEvent(GURL(), // source_url |
| 1444 GURL(), // source_main_frame_url |
| 1445 initial_url, // original_request_url |
| 1446 initial_url, // destination_url |
| 1447 true, // is_user_initiated, |
| 1448 true, // has_committed |
| 1449 false, // has_server_redirect |
| 1450 nav_map->at(initial_url).at(0)); |
| 1451 VerifyNavigationEvent(GURL(), // source_url |
| 1452 GURL(), // source_main_frame_url |
744 request_url, // original_request_url | 1453 request_url, // original_request_url |
745 download_url, // destination_url | 1454 download_url, // destination_url |
746 true, // is_user_initiated, | 1455 true, // is_user_initiated, |
747 false, // has_committed | 1456 false, // has_committed |
748 true, // has_server_redirect | 1457 true, // has_server_redirect |
749 nav_map->at(download_url).at(0)); | 1458 nav_map->at(download_url).at(0)); |
| 1459 |
| 1460 auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
| 1461 ASSERT_EQ(1U, referrer_chain.size()); |
| 1462 VerifyReferrerChainEntry(download_url, // url |
| 1463 ReferrerChainEntry::DOWNLOAD_URL, // type |
| 1464 test_server_ip, // ip_address |
| 1465 GURL(), // referrer_url |
| 1466 GURL(), // referrer_main_frame_url |
| 1467 false, // is_retargeting |
| 1468 referrer_chain[0]); |
750 } | 1469 } |
751 | 1470 |
752 // host_to_ip_map_ size should increase by one after a new navigation. | 1471 // host_to_ip_map_ size should increase by one after a new navigation. |
753 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, AddIPMapping) { | 1472 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, AddIPMapping) { |
| 1473 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
754 auto ip_map = host_to_ip_map(); | 1474 auto ip_map = host_to_ip_map(); |
755 std::string test_server_host(embedded_test_server()->base_url().host()); | 1475 std::string test_server_host(embedded_test_server()->base_url().host()); |
| 1476 ip_map->clear(); |
756 ip_map->insert( | 1477 ip_map->insert( |
757 std::make_pair(test_server_host, std::vector<ResolvedIPAddress>())); | 1478 std::make_pair(test_server_host, std::vector<ResolvedIPAddress>())); |
758 ASSERT_EQ(std::size_t(0), ip_map->at(test_server_host).size()); | 1479 ASSERT_EQ(std::size_t(0), ip_map->at(test_server_host).size()); |
759 ClickTestLink("direct_download", 1); | 1480 ClickTestLink("direct_download", 1, initial_url); |
760 EXPECT_EQ(std::size_t(1), ip_map->at(test_server_host).size()); | 1481 EXPECT_EQ(1U, ip_map->at(test_server_host).size()); |
761 EXPECT_EQ(embedded_test_server()->host_port_pair().host(), | 1482 EXPECT_EQ(embedded_test_server()->host_port_pair().host(), |
762 ip_map->at(test_server_host).back().ip); | 1483 ip_map->at(test_server_host).back().ip); |
763 } | 1484 } |
764 | 1485 |
765 // If we have already seen an IP associated with a host, update its timestamp. | 1486 // If we have already seen an IP associated with a host, update its timestamp. |
766 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, IPListDedup) { | 1487 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, IPListDedup) { |
| 1488 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
767 auto ip_map = host_to_ip_map(); | 1489 auto ip_map = host_to_ip_map(); |
| 1490 ip_map->clear(); |
768 std::string test_server_host(embedded_test_server()->base_url().host()); | 1491 std::string test_server_host(embedded_test_server()->base_url().host()); |
769 ip_map->insert( | 1492 ip_map->insert( |
770 std::make_pair(test_server_host, std::vector<ResolvedIPAddress>())); | 1493 std::make_pair(test_server_host, std::vector<ResolvedIPAddress>())); |
771 base::Time yesterday(base::Time::Now() - base::TimeDelta::FromDays(1)); | 1494 base::Time yesterday(base::Time::Now() - base::TimeDelta::FromDays(1)); |
772 ip_map->at(test_server_host) | 1495 ip_map->at(test_server_host) |
773 .push_back(ResolvedIPAddress( | 1496 .push_back(ResolvedIPAddress( |
774 yesterday, embedded_test_server()->host_port_pair().host())); | 1497 yesterday, embedded_test_server()->host_port_pair().host())); |
775 ASSERT_EQ(std::size_t(1), ip_map->at(test_server_host).size()); | 1498 ASSERT_EQ(1U, ip_map->at(test_server_host).size()); |
776 ClickTestLink("direct_download", 1); | 1499 ClickTestLink("direct_download", 1, initial_url); |
777 EXPECT_EQ(std::size_t(1), ip_map->at(test_server_host).size()); | 1500 EXPECT_EQ(1U, ip_map->at(test_server_host).size()); |
778 EXPECT_EQ(embedded_test_server()->host_port_pair().host(), | 1501 EXPECT_EQ(embedded_test_server()->host_port_pair().host(), |
779 ip_map->at(test_server_host).back().ip); | 1502 ip_map->at(test_server_host).back().ip); |
780 EXPECT_NE(yesterday, ip_map->at(test_server_host).front().timestamp); | 1503 EXPECT_NE(yesterday, ip_map->at(test_server_host).front().timestamp); |
781 } | 1504 } |
782 | 1505 |
783 } // namespace safe_browsing | 1506 } // namespace safe_browsing |
OLD | NEW |