Chromium Code Reviews| 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..5d9aeaa295cd7da56d8efe6608e4af34af3b81de 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(1ULL, download_items.size()); |
| + return download_items[0]; |
| + } |
| + |
| + // This function needs javascript support from test pages. |
|
Charlie Reis
2016/12/09 22:00:25
Let's elaborate a bit on what it needs, so that ot
Jialiu Lin
2016/12/12 23:43:37
Done.
|
| 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(); |
| + 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,15 +226,47 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest { |
| actual_nav_event.has_server_redirect); |
| } |
| + void VerifyReferrerChainEntry( |
| + const GURL& expected_url, |
| + 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, |
| + 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<ReferrerChainEntry> IdentifyReferrerChain( |
| + DownloadItem* download) { |
| + std::vector<ReferrerChainEntry> referrer_chain; |
| + int download_tab_id = |
| + SessionTabHelper::IdForTab(download->GetWebContents()); |
| + observer_manager_->IdentifyReferrerChain( |
|
Charlie Reis
2016/12/09 22:00:25
Please include an EXPECT_EQ for the return value.
Jialiu Lin
2016/12/12 23:43:37
Done.
|
| + download->GetURL(), download_tab_id, 2, &referrer_chain); |
|
Charlie Reis
2016/12/09 22:00:24
Let's document that 2 is the user gesture limit.
Jialiu Lin
2016/12/12 23:43:37
Done.
|
| + return referrer_chain; |
| + } |
| + |
| void VerifyHostToIpMap() { |
| // Since all testing pages have the same host, there is only one entry in |
| // host_to_ip_map_. |
| SafeBrowsingNavigationObserverManager::HostToIpMap* actual_host_ip_map = |
| host_to_ip_map(); |
| - ASSERT_EQ(std::size_t(1), actual_host_ip_map->size()); |
| + ASSERT_EQ(1ULL, actual_host_ip_map->size()); |
|
Charlie Reis
2016/12/09 22:00:25
I'm curious, is there a reason to use ULL here? I
Jialiu Lin
2016/12/12 23:43:37
You're right. U is more commonly used in size lite
|
| auto ip_list = |
| actual_host_ip_map->at(embedded_test_server()->base_url().host()); |
| - ASSERT_EQ(std::size_t(1), ip_list.size()); |
| + ASSERT_EQ(1ULL, ip_list.size()); |
| EXPECT_EQ(embedded_test_server()->host_port_pair().host(), |
| ip_list.back().ip); |
| } |
| @@ -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(2ULL, nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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()); |
|
Charlie Reis
2016/12/09 22:00:25
nit: Blank line before (same in all tests). This
Jialiu Lin
2016/12/12 23:43:37
Done.
|
| + ASSERT_EQ(1ULL, referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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(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(2ULL, nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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(2ULL, referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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 |
| + 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(1), nav_map->at(download_url).size()); |
| + ASSERT_EQ(2ULL, nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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(2ULL, referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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 |
| + 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->at(download_url).size()); |
| - // The first NavigationEvent was obtained from NOIFICATION_RETARGETING. |
| + ASSERT_EQ(2ULL, nav_map->size()); |
| + ASSERT_EQ(2ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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(2ULL, referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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 |
| + 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(1), nav_map->at(redirect_url).size()); |
| - ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
| + ASSERT_EQ(std::size_t(3), nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(redirect_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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 |
| + 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 |
| + 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 |
| + 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(2), nav_map->at(redirect_url).size()); |
| - ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
| + ASSERT_EQ(std::size_t(3), nav_map->size()); |
| + ASSERT_EQ(2ULL, nav_map->at(redirect_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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()); |
| + ASSERT_EQ(std::size_t(3), referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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 |
| + 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 |
| + 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(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(4), nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(first_redirect_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(second_redirect_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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 |
| + 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 |
| + 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 |
| + 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 |
| + 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(1), nav_map->at(download_url).size()); |
| + ASSERT_EQ(2ULL, nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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(2ULL, referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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 |
| + 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(1), nav_map->at(redirect_url).size()); |
| - ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
| + ASSERT_EQ(std::size_t(3), nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(redirect_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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 |
| + 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 |
| + 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 |
| + 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(2), nav_map->at(blank_url).size()); |
| - ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
| + ASSERT_EQ(std::size_t(3), nav_map->size()); |
| + ASSERT_EQ(2ULL, nav_map->at(blank_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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 |
| + 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 |
| + 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 |
| + 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(2), nav_map->at(blank_url).size()); |
| - ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); |
| + ASSERT_EQ(std::size_t(3), nav_map->size()); |
| + ASSERT_EQ(2ULL, nav_map->at(blank_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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 |
| + 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 |
| + 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 |
| + 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(1), nav_map->at(download_url).size()); |
| + ASSERT_EQ(2ULL, nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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(2ULL, referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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 |
| + 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(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(5), nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(multi_frame_test_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(iframe_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(iframe_retargeting_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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(2ULL, referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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 |
| + 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(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(6), nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(multi_frame_test_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(iframe_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(iframe_retargeting_url).size()); |
| + ASSERT_EQ(2ULL, nav_map->at(blank_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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 |
| + 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 |
| + 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 |
| + 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_referrer_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(1ULL, nav_map->at(redirect_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(landing_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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 |
| + 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 |
| + 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 |
| + 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 |
| + 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. |
|
Charlie Reis
2016/12/09 22:00:24
nit: reaching
Jialiu Lin
2016/12/12 23:43:37
Done.
|
| +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(1ULL, nav_map->at(initial_url).size()); |
| + ASSERT_EQ(1ULL, |
| + nav_map->at(page_before_landing_referrer_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(landing_referrer_url).size()); |
| + ASSERT_EQ(1ULL, nav_map->at(landing_url).size()); |
| + ASSERT_EQ(1ULL, 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 |
| + 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 |
| + 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 |
| + 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,37 +1452,60 @@ 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(1), nav_map->at(download_url).size()); |
| - VerifyNavigationEvent(initial_url, // source_url |
| - initial_url, // source_main_frame_url |
| + ASSERT_EQ(2ULL, nav_map->size()); |
| + ASSERT_EQ(1ULL, nav_map->at(download_url).size()); |
| + ASSERT_EQ(1ULL, 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(1ULL, referrer_chain.size()); |
| + VerifyReferrerChainEntry( |
| + download_url, // url |
| + 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); |
| - EXPECT_EQ(std::size_t(1), ip_map->at(test_server_host).size()); |
| + ClickTestLink("direct_download", 1, initial_url); |
| + EXPECT_EQ(1ULL, ip_map->at(test_server_host).size()); |
| EXPECT_EQ(embedded_test_server()->host_port_pair().host(), |
| ip_map->at(test_server_host).back().ip); |
| } |
| // 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>())); |
| @@ -772,9 +1513,9 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, IPListDedup) { |
| ip_map->at(test_server_host) |
| .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); |
| - EXPECT_EQ(std::size_t(1), ip_map->at(test_server_host).size()); |
| + ASSERT_EQ(1ULL, ip_map->at(test_server_host).size()); |
| + ClickTestLink("direct_download", 1, initial_url); |
| + EXPECT_EQ(1ULL, ip_map->at(test_server_host).size()); |
| EXPECT_EQ(embedded_test_server()->host_port_pair().host(), |
| ip_map->at(test_server_host).back().ip); |
| EXPECT_NE(yesterday, ip_map->at(test_server_host).front().timestamp); |