Index: chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc |
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc |
index 1a09af8108053f658477b01be1cc9d3493878903..636142655a8c172fb6d9e858514a8f25c1bf85bb 100644 |
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc |
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc |
@@ -6,8 +6,10 @@ |
#include "chrome/browser/chrome_notification_types.h" |
#include "chrome/browser/download/download_prefs.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/safe_browsing/download_protection_service.h" |
#include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h" |
#include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h" |
+#include "chrome/browser/safe_browsing/test_safe_browsing_service.h" |
#include "chrome/browser/sessions/session_tab_helper.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
@@ -27,6 +29,8 @@ |
#include "url/gurl.h" |
#include "url/url_canon.h" |
+using content::DownloadItem; |
+ |
namespace safe_browsing { |
const char kSingleFrameTestURL[] = |
@@ -50,6 +54,18 @@ const char kIframeRetargetingURL[] = |
"/safe_browsing/download_protection/navigation_observer/" |
"iframe_retargeting.html"; |
const char kDownloadItemURL[] = "/safe_browsing/download_protection/signed.exe"; |
+const char kRedirectToLandingURL[] = |
+ "/safe_browsing/download_protection/navigation_observer/" |
+ "redirect_to_landing.html"; |
+const char kLandingURL[] = |
+ "/safe_browsing/download_protection/navigation_observer/" |
+ "landing.html"; |
+const char kLandingReferrerURL[] = |
+ "/safe_browsing/download_protection/navigation_observer/" |
+ "landing_referrer.html"; |
+const char kPageBeforeLandingReferrerURL[] = |
+ "/safe_browsing/download_protection/navigation_observer/" |
+ "page_before_landing_referrer.html"; |
// Test class to help create SafeBrowsingNavigationObservers for each |
// WebContents before they are actually installed through AttachTabHelper. |
@@ -93,15 +109,15 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest { |
false); |
ASSERT_TRUE(embedded_test_server()->Start()); |
host_resolver()->AddRule("*", "127.0.0.1"); |
- // Navigate to test page. |
- ui_test_utils::NavigateToURL( |
- browser(), embedded_test_server()->GetURL(kSingleFrameTestURL)); |
observer_manager_ = new TestNavigationObserverManager(); |
observer_ = new SafeBrowsingNavigationObserver( |
browser()->tab_strip_model()->GetActiveWebContents(), |
observer_manager_); |
ASSERT_TRUE(observer_); |
ASSERT_TRUE(InitialSetup()); |
+ // Navigate to test page. |
+ ui_test_utils::NavigateToURL( |
+ browser(), embedded_test_server()->GetURL(kSingleFrameTestURL)); |
} |
bool InitialSetup() { |
@@ -126,13 +142,17 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest { |
return true; |
} |
- void TearDownOnMainThread() override { delete observer_; } |
+ void TearDownOnMainThread() override { |
+ // Cancel unfinished download if any. |
+ CancelDownloads(); |
+ delete observer_; |
+ } |
// Most test cases will trigger downloads, though we don't really care if |
// download completed or not. So we cancel downloads as soon as we record |
// all the navigation events we need. |
void CancelDownloads() { |
- std::vector<content::DownloadItem*> download_items; |
+ std::vector<DownloadItem*> download_items; |
content::DownloadManager* manager = |
content::BrowserContext::GetDownloadManager(browser()->profile()); |
manager->GetAllDownloads(&download_items); |
@@ -142,11 +162,19 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest { |
} |
} |
- // This function needs javascript support, only works on |
- // navigation_observer_tests.html and |
- // navigation_observer_multi_frame_tests.html. |
+ DownloadItem* GetDownload() { |
+ std::vector<DownloadItem*> download_items; |
+ content::DownloadManager* manager = |
+ content::BrowserContext::GetDownloadManager(browser()->profile()); |
+ manager->GetAllDownloads(&download_items); |
+ EXPECT_EQ(std::size_t(1), download_items.size()); |
+ return download_items[0]; |
+ } |
+ |
+ // This function needs javascript support from test pages. |
void ClickTestLink(const char* test_name, |
- int number_of_navigations) { |
+ int number_of_navigations, |
+ const GURL& page_clicked) { |
TabStripModel* tab_strip = browser()->tab_strip_model(); |
content::WebContents* current_web_contents = |
tab_strip->GetActiveWebContents(); |
@@ -161,8 +189,21 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest { |
// Wait for navigations on current tab and new tab (if any) to finish. |
navigation_observer.Wait(); |
navigation_observer.StopWatchingNewWebContents(); |
- // Cancel unfinished download if any. |
- CancelDownloads(); |
+ |
+ // Since this test uses javascript to mimic clicking on a link (no actual |
+ // user gesture), and DidGetUserInteraction() does not respond to |
+ // ExecuteScript(), is_user_initiated field in resulting NavigationEvents |
+ // will always be false. Therefore, we need to make some adjustment to |
+ // relevant NavigationEvent. |
+ for (auto it = navigation_map()->begin(); it != navigation_map()->end(); |
Nathan Parker
2016/12/05 22:21:23
nit: Can you do
for (auto it : navigation_map()) ?
Jialiu Lin
2016/12/06 23:10:06
Ack.
That needs a copy constructor for NavigationE
|
+ it++) { |
+ for (NavigationEvent& nav_event : it->second) { |
+ if (nav_event.source_url == page_clicked) { |
+ nav_event.is_user_initiated = true; |
+ return; |
+ } |
+ } |
+ } |
} |
void VerifyNavigationEvent(const GURL& expected_source_url, |
@@ -185,6 +226,38 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest { |
actual_nav_event.has_server_redirect); |
} |
+ void VerifyReferrerChainEntry( |
+ const GURL& expected_url, |
+ ClientDownloadRequest::ReferrerChainEntry::URLType expected_type, |
+ const std::string& expected_ip_address, |
+ const GURL& expected_referrer_url, |
+ const GURL& expected_referrer_main_frame_url, |
+ bool expected_is_retargeting, |
+ ClientDownloadRequest::ReferrerChainEntry actual_entry) { |
+ EXPECT_EQ(expected_url.spec(), actual_entry.url()); |
+ EXPECT_EQ(expected_type, actual_entry.type()); |
+ if (expected_ip_address.empty()) { |
+ ASSERT_EQ(0, actual_entry.ip_address_size()); |
+ } else { |
+ ASSERT_EQ(1, actual_entry.ip_address_size()); |
+ EXPECT_EQ(expected_ip_address, actual_entry.ip_address(0)); |
+ } |
+ EXPECT_EQ(expected_referrer_url.spec(), actual_entry.referrer_url()); |
+ EXPECT_EQ(expected_referrer_main_frame_url.spec(), |
+ actual_entry.referrer_main_frame_url()); |
+ EXPECT_EQ(expected_is_retargeting, actual_entry.is_retargeting()); |
+ } |
+ |
+ std::vector<ClientDownloadRequest::ReferrerChainEntry> IdentifyReferrerChain( |
+ DownloadItem* download) { |
+ std::vector<ClientDownloadRequest::ReferrerChainEntry> referrer_chain; |
+ int download_tab_id = |
+ SessionTabHelper::IdForTab(download->GetWebContents()); |
+ observer_manager_->IdentifyReferrerChain( |
+ download->GetURL(), download_tab_id, 2, &referrer_chain); |
+ return referrer_chain; |
+ } |
+ |
void VerifyHostToIpMap() { |
// Since all testing pages have the same host, there is only one entry in |
// host_to_ip_map_. |
@@ -214,63 +287,166 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest { |
base::ScopedTempDir downloads_directory_; |
}; |
+// Type download URL into address bar and start download on the same page. |
+IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, TypeInURLDownload) { |
+ ui_test_utils::NavigateToURL( |
+ browser(), embedded_test_server()->GetURL(kDownloadItemURL)); |
+ GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
+ auto nav_map = navigation_map(); |
+ ASSERT_TRUE(nav_map); |
+ ASSERT_EQ(std::size_t(2), nav_map->size()); |
Nathan Parker
2016/12/05 22:21:23
nit: 2ull might work if std::size(..) gets annoyin
Jialiu Lin
2016/12/06 23:10:06
Good to know. Thanks!
|
+ ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ download_url, // original_request_url |
+ download_url, // destination_url |
+ true, // is_user_initiated, |
+ false, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(download_url).at(0)); |
+ VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(1), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+} |
// Click on a link and start download on the same page. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, DirectDownload) { |
- ClickTestLink("direct_download", 1); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("direct_download", 1, initial_url); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(1), nav_map->size()); |
+ ASSERT_EQ(std::size_t(2), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
- // Since this test uses javascript to mimic clicking on a link (no actual user |
- // gesture), and DidGetUserInteraction() does not respond to ExecuteScript(), |
- // therefore is_user_initiated is false. |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
download_url, // original_request_url |
download_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(2), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
} |
// Click on a link with rel="noreferrer" attribute, and start download on the |
// same page. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
DirectDownloadNoReferrer) { |
- ClickTestLink("direct_download_noreferrer", 1); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("direct_download_noreferrer", 1, initial_url); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(1), nav_map->size()); |
+ ASSERT_EQ(std::size_t(2), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
download_url, // original_request_url |
download_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(2), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
} |
// Click on a link with rel="noreferrer" attribute, and start download in a |
// new tab using target=_blank. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
DirectDownloadNoReferrerTargetBlank) { |
- ClickTestLink("direct_download_noreferrer_target_blank", 1); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("direct_download_noreferrer_target_blank", 1, initial_url); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(1), nav_map->size()); |
+ ASSERT_EQ(std::size_t(2), nav_map->size()); |
ASSERT_EQ(std::size_t(2), nav_map->at(download_url).size()); |
- // The first NavigationEvent was obtained from NOIFICATION_RETARGETING. |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
+ // The next NavigationEvent was obtained from NOIFICATION_RETARGETING. |
// TODO(jialiul): After https://crbug.com/651895 is fixed, we'll no longer |
// listen to NOTIFICATION_RETARGETING, hence only one NavigationEvent will |
// be observed with the true initator URL. This applies to other new tab |
@@ -279,11 +455,11 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
initial_url, // source_main_frame_url |
download_url, // original_request_url |
download_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
- // The second one is the actual navigation which triggers download. |
+ // This one is the actual navigation which triggers download. |
VerifyNavigationEvent(GURL(), // source_url |
GURL(), // source_main_frame_url |
download_url, // original_request_url |
@@ -293,28 +469,56 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
false, // has_server_redirect |
nav_map->at(download_url).at(1)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(2), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ true, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
} |
// Click on a link which navigates to a page then redirects to a download using |
// META HTTP-EQUIV="refresh". All transitions happen in the same tab. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
SingleMetaRefreshRedirect) { |
- ClickTestLink("single_meta_refresh_redirect", 2); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("single_meta_refresh_redirect", 2, initial_url); |
GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
// Since unlike server redirects client redirects commit and then generate a |
// second navigation, our observer records two NavigationEvents for this test. |
- ASSERT_EQ(std::size_t(2), nav_map->size()); |
+ ASSERT_EQ(std::size_t(3), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
redirect_url, // original_request_url |
redirect_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
true, // has_committed |
false, // has_server_redirect |
nav_map->at(redirect_url).at(0)); |
@@ -327,6 +531,32 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ redirect_url, // referrer_url |
+ redirect_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ redirect_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[2]); |
} |
// https://crbug.com/667784: The test is flaky on Linux. |
@@ -339,15 +569,25 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
// META HTTP-EQUIV="refresh". First navigation happens in target blank. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
MAYBE_SingleMetaRefreshRedirectTargetBlank) { |
- ClickTestLink("single_meta_refresh_redirect_target_blank", 2); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("single_meta_refresh_redirect_target_blank", 2, initial_url); |
GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(2), nav_map->size()); |
+ ASSERT_EQ(std::size_t(3), nav_map->size()); |
ASSERT_EQ(std::size_t(2), nav_map->at(redirect_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
// TODO(jialiul): After https://crbug.com/651895 is fixed, we'll no longer |
// listen to NOTIFICATION_RETARGETING, hence only two NavigationEvents will |
// be observed with the true initator URL. |
@@ -355,7 +595,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
initial_url, // source_main_frame_url |
redirect_url, // original_request_url |
redirect_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(redirect_url).at(0)); |
@@ -376,30 +616,66 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
Nathan Parker
2016/12/05 22:21:23
Nit: for readability, maybe put a blank line betwe
|
+ ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ redirect_url, // referrer_url |
+ redirect_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ redirect_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ true, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[2]); |
} |
// Click on a link which redirects twice before reaching download using |
// META HTTP-EQUIV="refresh". All transitions happen in the same tab. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
MultiMetaRefreshRedirects) { |
- ClickTestLink("multiple_meta_refresh_redirects", 3); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("multiple_meta_refresh_redirects", 3, initial_url); |
GURL first_redirect_url = embedded_test_server()->GetURL( |
"/safe_browsing/download_protection/navigation_observer/" |
"double_redirect.html"); |
GURL second_redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(3), nav_map->size()); |
+ ASSERT_EQ(std::size_t(4), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(first_redirect_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(second_redirect_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
first_redirect_url, // original_request_url |
first_redirect_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
true, // has_committed |
false, // has_server_redirect |
nav_map->at(first_redirect_url).at(0)); |
@@ -420,47 +696,119 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(4), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ second_redirect_url, // referrer_url |
+ second_redirect_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ second_redirect_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ test_server_ip, // ip_address |
+ first_redirect_url, // referrer_url |
+ first_redirect_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ first_redirect_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[2]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[3]); |
} |
// Click on a link which redirects to download using window.location. |
// All transitions happen in the same tab. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
WindowLocationRedirect) { |
- ClickTestLink("window_location_redirection", 1); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("window_location_redirection", 1, initial_url); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(1), nav_map->size()); |
+ ASSERT_EQ(std::size_t(2), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
download_url, // original_request_url |
download_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(2), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
} |
// Click on a link which redirects twice until it reaches download using a |
// mixture of meta refresh and window.location. All transitions happen in the |
// same tab. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, MixRedirects) { |
- ClickTestLink("mix_redirects", 2); |
- GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("mix_redirects", 2, initial_url); |
+ GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(2), nav_map->size()); |
+ ASSERT_EQ(std::size_t(3), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
redirect_url, // original_request_url |
redirect_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
true, // has_committed |
false, // has_server_redirect |
nav_map->at(redirect_url).at(0)); |
@@ -473,24 +821,60 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, MixRedirects) { |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ redirect_url, // referrer_url |
+ redirect_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ redirect_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[2]); |
} |
// Use javascript to open download in a new tab. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, NewTabDownload) { |
- ClickTestLink("new_tab_download", 2); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("new_tab_download", 2, initial_url); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
GURL blank_url = GURL(url::kAboutBlankURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(2), nav_map->size()); |
+ ASSERT_EQ(std::size_t(3), nav_map->size()); |
ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
blank_url, // original_request_url |
blank_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(blank_url).at(0)); |
@@ -518,26 +902,62 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, NewTabDownload) { |
EXPECT_EQ(nav_map->at(download_url).at(0).source_tab_id, |
nav_map->at(download_url).at(0).target_tab_id); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ blank_url, // referrer_url |
+ blank_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ blank_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ "", // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ true, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[2]); |
} |
// Use javascript to open download in a new tab and download has a data url. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
NewTabDownloadWithDataURL) { |
- ClickTestLink("new_tab_download_with_data_url", 2); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("new_tab_download_with_data_url", 2, initial_url); |
GURL download_url = GURL(kDownloadDataURL); |
- GURL blank_url = GURL("about:blank"); |
+ GURL blank_url = GURL(url::kAboutBlankURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(2), nav_map->size()); |
+ ASSERT_EQ(std::size_t(3), nav_map->size()); |
ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
// The first one comes from NOTIFICATION_RETARGETING. |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
blank_url, // original_request_url |
blank_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(blank_url).at(0)); |
@@ -564,8 +984,33 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
nav_map->at(download_url).at(0)); |
EXPECT_TRUE(nav_map->at(download_url).at(0).source_tab_id == |
nav_map->at(download_url).at(0).target_tab_id); |
- // Since data url does does not have IP, host_to_ip_map_ should be empty. |
- EXPECT_EQ(std::size_t(0), host_to_ip_map()->size()); |
+ VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ "", // ip_address |
+ blank_url, // referrer_url |
+ blank_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ blank_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ "", // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ true, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[2]); |
} |
// TODO(jialiul): Need to figure out why this test is failing on Windows and |
@@ -574,25 +1019,53 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
// Download via html5 file API. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
MAYBE_DownloadViaHTML5FileApi) { |
- ClickTestLink("html5_file_api", 1); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("html5_file_api", 1, initial_url); |
std::string download_url_str = |
base::StringPrintf("filesystem:%stemporary/test.exe", |
embedded_test_server()->base_url().spec().c_str()); |
GURL download_url = GURL(download_url_str); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(1), nav_map->size()); |
+ ASSERT_EQ(std::size_t(2), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
VerifyNavigationEvent(initial_url, // source_url |
initial_url, // source_main_frame_url |
download_url, // original_request_url |
download_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(2), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ "", // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
} |
// Click a link in a subframe and start download. |
@@ -602,23 +1075,33 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
browser(), embedded_test_server()->GetURL(kMultiFrameTestURL)); |
std::string test_name = |
base::StringPrintf("%s', '%s", "iframe1", "iframe_direct_download"); |
- ClickTestLink(test_name.c_str(), 1); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
GURL multi_frame_test_url = |
embedded_test_server()->GetURL(kMultiFrameTestURL); |
GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL); |
+ ClickTestLink(test_name.c_str(), 1, iframe_url); |
GURL iframe_retargeting_url = |
embedded_test_server()->GetURL(kIframeRetargetingURL); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(4), nav_map->size()); |
+ ASSERT_EQ(std::size_t(5), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(multi_frame_test_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(iframe_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(iframe_retargeting_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
- VerifyNavigationEvent(initial_url, // source_url |
- initial_url, // source_main_frame_url |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
multi_frame_test_url, // original_request_url |
multi_frame_test_url, // destination_url |
true, // is_user_initiated, |
@@ -645,11 +1128,29 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
multi_frame_test_url, // source_main_frame_url |
download_url, // original_request_url |
download_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(2), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ iframe_url, // referrer_url |
+ multi_frame_test_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ iframe_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ multi_frame_test_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
} |
// Click a link in a subframe and open download in a new tab. |
@@ -659,25 +1160,35 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
browser(), embedded_test_server()->GetURL(kMultiFrameTestURL)); |
std::string test_name = |
base::StringPrintf("%s', '%s", "iframe2", "iframe_new_tab_download"); |
- ClickTestLink(test_name.c_str(), 2); |
GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
GURL multi_frame_test_url = |
embedded_test_server()->GetURL(kMultiFrameTestURL); |
GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL); |
GURL iframe_retargeting_url = |
embedded_test_server()->GetURL(kIframeRetargetingURL); |
+ ClickTestLink(test_name.c_str(), 2, iframe_retargeting_url); |
GURL blank_url = GURL(url::kAboutBlankURL); |
GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(5), nav_map->size()); |
+ ASSERT_EQ(std::size_t(6), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(multi_frame_test_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(iframe_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(iframe_retargeting_url).size()); |
ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
- VerifyNavigationEvent(initial_url, // source_url |
- initial_url, // source_main_frame_url |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
multi_frame_test_url, // original_request_url |
multi_frame_test_url, // destination_url |
true, // is_user_initiated, |
@@ -704,7 +1215,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
multi_frame_test_url, // source_main_frame_url |
blank_url, // original_request_url |
blank_url, // destination_url |
- false, // is_user_initiated, |
+ true, // is_user_initiated, |
false, // has_committed |
false, // has_server_redirect |
nav_map->at(blank_url).at(0)); |
@@ -725,6 +1236,213 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
false, // has_server_redirect |
nav_map->at(download_url).at(0)); |
VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ EXPECT_EQ(std::size_t(3), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ blank_url, // referrer_url |
+ blank_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ blank_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ "", // ip_address |
+ iframe_retargeting_url, // referrer_url |
+ multi_frame_test_url, // referrer_main_frame_url |
+ true, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ iframe_retargeting_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ multi_frame_test_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[2]); |
+} |
+ |
+// Click a link which redirects to the landing page, and then click on the |
+// landing page to trigger download. |
+IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, CompleteReferrerChain) { |
+ GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("complete_referer_chain", 2, initial_url); |
+ GURL redirect_url = embedded_test_server()->GetURL(kRedirectToLandingURL); |
+ GURL landing_url = embedded_test_server()->GetURL(kLandingURL); |
+ ClickTestLink("download_on_landing_page", 1, landing_url); |
+ GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
+ auto nav_map = navigation_map(); |
+ ASSERT_TRUE(nav_map); |
+ ASSERT_EQ(std::size_t(4), nav_map->size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(landing_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
+ VerifyNavigationEvent(initial_url, // source_url |
+ initial_url, // source_main_frame_url |
+ redirect_url, // original_request_url |
+ redirect_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(redirect_url).at(0)); |
+ VerifyNavigationEvent(redirect_url, // source_url |
+ redirect_url, // source_main_frame_url |
+ landing_url, // original_request_url |
+ landing_url, // destination_url |
+ false, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(landing_url).at(0)); |
+ VerifyNavigationEvent(landing_url, // source_url |
+ landing_url, // source_main_frame_url |
+ download_url, // original_request_url |
+ download_url, // destination_url |
+ true, // is_user_initiated, |
+ false, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(download_url).at(0)); |
+ VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ EXPECT_EQ(std::size_t(4), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ landing_url, // referrer_url |
+ landing_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ landing_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ redirect_url, // referrer_url |
+ redirect_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ redirect_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::CLIENT_REDIRECT, // type |
+ test_server_ip, // ip_address |
+ initial_url, // referrer_url |
+ initial_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[2]); |
+ VerifyReferrerChainEntry( |
+ initial_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_REFERRER, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url is empty since this beyonds 2 clicks. |
+ GURL(), // referrer_main_frame_url is empty for the same reason. |
+ false, // is_retargeting |
+ referrer_chain[3]); |
+} |
+ |
+// Click three links before reach download. |
+IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, |
+ ReferrerAttributionWithinTwoUserGestures) { |
+ GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
+ ClickTestLink("attribution_within_two_user_gestures", 1, initial_url); |
+ GURL page_before_landing_referrer_url = |
+ embedded_test_server()->GetURL(kPageBeforeLandingReferrerURL); |
+ ClickTestLink("link_to_landing_referrer", 1, |
+ page_before_landing_referrer_url); |
+ GURL landing_referrer_url = |
+ embedded_test_server()->GetURL(kLandingReferrerURL); |
+ ClickTestLink("link_to_landing", 1, landing_referrer_url); |
+ GURL landing_url = embedded_test_server()->GetURL(kLandingURL); |
+ ClickTestLink("download_on_landing_page", 1, landing_url); |
+ GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
+ auto nav_map = navigation_map(); |
+ ASSERT_TRUE(nav_map); |
+ ASSERT_EQ(std::size_t(5), nav_map->size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ ASSERT_EQ(std::size_t(1), |
+ nav_map->at(page_before_landing_referrer_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(landing_referrer_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(landing_url).size()); |
+ ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
+ VerifyNavigationEvent(initial_url, // source_url |
+ initial_url, // source_main_frame_url |
+ page_before_landing_referrer_url, // original_request |
+ page_before_landing_referrer_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(page_before_landing_referrer_url).at(0)); |
+ VerifyNavigationEvent(page_before_landing_referrer_url, // source_url |
+ page_before_landing_referrer_url, // source_main_frame |
+ landing_referrer_url, // original_request_url |
+ landing_referrer_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(landing_referrer_url).at(0)); |
+ VerifyNavigationEvent(landing_referrer_url, // source_url |
+ landing_referrer_url, // source_main_frame |
+ landing_url, // original_request_url |
+ landing_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(landing_url).at(0)); |
+ VerifyNavigationEvent(landing_url, // source_url |
+ landing_url, // source_main_frame_url |
+ download_url, // original_request_url |
+ download_url, // destination_url |
+ true, // is_user_initiated, |
+ false, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(download_url).at(0)); |
+ VerifyHostToIpMap(); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ EXPECT_EQ(std::size_t(3), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ landing_url, // referrer_url |
+ landing_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
+ VerifyReferrerChainEntry( |
+ landing_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_PAGE, // type |
+ test_server_ip, // ip_address |
+ landing_referrer_url, // referrer_url |
+ landing_referrer_url, // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[1]); |
+ VerifyReferrerChainEntry( |
+ landing_referrer_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::LANDING_REFERRER, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url is empty since this beyonds 2 clicks. |
+ GURL(), // referrer_main_frame_url is empty for the same reason. |
+ false, // is_retargeting |
+ referrer_chain[2]); |
+ // page_before_landing_referrer_url is not in referrer chain. |
} |
// Server-side redirect. |
@@ -734,29 +1452,50 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, ServerRedirect) { |
GURL request_url = |
embedded_test_server()->GetURL("/server-redirect?" + download_url.spec()); |
ui_test_utils::NavigateToURL(browser(), request_url); |
- CancelDownloads(); |
+ std::string test_server_ip(embedded_test_server()->host_port_pair().host()); |
auto nav_map = navigation_map(); |
ASSERT_TRUE(nav_map); |
- ASSERT_EQ(std::size_t(1), nav_map->size()); |
+ ASSERT_EQ(std::size_t(2), nav_map->size()); |
ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
- VerifyNavigationEvent(initial_url, // source_url |
- initial_url, // source_main_frame_url |
+ ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size()); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
+ initial_url, // original_request_url |
+ initial_url, // destination_url |
+ true, // is_user_initiated, |
+ true, // has_committed |
+ false, // has_server_redirect |
+ nav_map->at(initial_url).at(0)); |
+ VerifyNavigationEvent(GURL(), // source_url |
+ GURL(), // source_main_frame_url |
request_url, // original_request_url |
download_url, // destination_url |
true, // is_user_initiated, |
false, // has_committed |
true, // has_server_redirect |
nav_map->at(download_url).at(0)); |
+ auto referrer_chain = IdentifyReferrerChain(GetDownload()); |
+ ASSERT_EQ(std::size_t(1), referrer_chain.size()); |
+ VerifyReferrerChainEntry( |
+ download_url, // url |
+ ClientDownloadRequest::ReferrerChainEntry::DOWNLOAD_URL, // type |
+ test_server_ip, // ip_address |
+ GURL(), // referrer_url |
+ GURL(), // referrer_main_frame_url |
+ false, // is_retargeting |
+ referrer_chain[0]); |
} |
// host_to_ip_map_ size should increase by one after a new navigation. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, AddIPMapping) { |
+ GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
auto ip_map = host_to_ip_map(); |
std::string test_server_host(embedded_test_server()->base_url().host()); |
+ ip_map->clear(); |
ip_map->insert( |
std::make_pair(test_server_host, std::vector<ResolvedIPAddress>())); |
ASSERT_EQ(std::size_t(0), ip_map->at(test_server_host).size()); |
- ClickTestLink("direct_download", 1); |
+ ClickTestLink("direct_download", 1, initial_url); |
EXPECT_EQ(std::size_t(1), ip_map->at(test_server_host).size()); |
EXPECT_EQ(embedded_test_server()->host_port_pair().host(), |
ip_map->at(test_server_host).back().ip); |
@@ -764,7 +1503,9 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, AddIPMapping) { |
// If we have already seen an IP associated with a host, update its timestamp. |
IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, IPListDedup) { |
+ GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); |
auto ip_map = host_to_ip_map(); |
+ ip_map->clear(); |
std::string test_server_host(embedded_test_server()->base_url().host()); |
ip_map->insert( |
std::make_pair(test_server_host, std::vector<ResolvedIPAddress>())); |
@@ -773,7 +1514,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, IPListDedup) { |
.push_back(ResolvedIPAddress( |
yesterday, embedded_test_server()->host_port_pair().host())); |
ASSERT_EQ(std::size_t(1), ip_map->at(test_server_host).size()); |
- ClickTestLink("direct_download", 1); |
+ ClickTestLink("direct_download", 1, initial_url); |
EXPECT_EQ(std::size_t(1), ip_map->at(test_server_host).size()); |
EXPECT_EQ(embedded_test_server()->host_port_pair().host(), |
ip_map->at(test_server_host).back().ip); |