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

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

Issue 2538483002: Add management related code to SafeBrowsingNavigationObserverManager (Closed)
Patch Set: address nits Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698