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

Unified Diff: chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc

Issue 2538483002: Add management related code to SafeBrowsingNavigationObserverManager (Closed)
Patch Set: address nits Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..7450d8182b41ec86accad557fce2ea32b2975d5f 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,22 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest {
}
}
- // This function needs javascript support, only works on
- // navigation_observer_tests.html and
- // navigation_observer_multi_frame_tests.html.
- void ClickTestLink(const char* test_name,
- int number_of_navigations) {
+ DownloadItem* GetDownload() {
+ std::vector<DownloadItem*> download_items;
+ content::DownloadManager* manager =
+ content::BrowserContext::GetDownloadManager(browser()->profile());
+ manager->GetAllDownloads(&download_items);
+ EXPECT_EQ(1U, download_items.size());
+ return download_items[0];
+ }
+
+ // This function needs javascript support from the test page hosted at
+ // |page_url|. It calls "clickLink(..)" javascript function to "click" on the
+ // html element with ID specified by |element_id|, and waits for
+ // |number_of_navigations| to complete.
+ void ClickTestLink(const char* element_id,
+ int number_of_navigations,
+ const GURL& page_url) {
TabStripModel* tab_strip = browser()->tab_strip_model();
content::WebContents* current_web_contents =
tab_strip->GetActiveWebContents();
@@ -156,13 +187,26 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest {
number_of_navigations);
navigation_observer.StartWatchingNewWebContents();
// Execute test.
- std::string script = base::StringPrintf("clickLink('%s');", test_name);
+ std::string script = base::StringPrintf("clickLink('%s');", element_id);
ASSERT_TRUE(content::ExecuteScript(current_web_contents, script));
// 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_url) {
+ nav_event.is_user_initiated = true;
+ return;
+ }
+ }
+ }
}
void VerifyNavigationEvent(const GURL& expected_source_url,
@@ -185,15 +229,51 @@ 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_addresses_size());
+ } else {
+ ASSERT_EQ(1, actual_entry.ip_addresses_size());
+ EXPECT_EQ(expected_ip_address, actual_entry.ip_addresses(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());
+ // IdentifyReferrerChain should return SUCCESS(1), SUCCESS_LANDING_PAGE(2),
+ // or SUCCESS_LANDING_REFERRER(3) in all these tests.
+ EXPECT_LE(observer_manager_->IdentifyReferrerChain(
+ download->GetURL(), download_tab_id,
+ 2, // kDownloadAttributionUserGestureLimit
+ &referrer_chain),
+ SafeBrowsingNavigationObserverManager::SUCCESS_LANDING_REFERRER);
+ 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(1U, actual_host_ip_map->size());
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(1U, ip_list.size());
EXPECT_EQ(embedded_test_server()->host_port_pair().host(),
ip_list.back().ip);
}
@@ -214,63 +294,164 @@ 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(2U, nav_map->size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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(1U, 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(2U, nav_map->size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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(2U, 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(2U, nav_map->size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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(2U, 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(2U, nav_map->size());
+ ASSERT_EQ(2U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 +460,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 +474,55 @@ 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(2U, 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(1U, nav_map->at(redirect_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 +535,30 @@ 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 +571,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(2U, nav_map->at(redirect_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 +597,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 +618,64 @@ 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(1U, nav_map->at(first_redirect_url).size());
+ ASSERT_EQ(1U, nav_map->at(second_redirect_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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,115 @@ 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(2U, nav_map->size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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(2U, 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(1U, nav_map->at(redirect_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 +817,58 @@ 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(2U, nav_map->at(blank_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 +896,60 @@ 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(2U, nav_map->at(blank_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 +976,31 @@ 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 +1009,52 @@ 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(2U, nav_map->size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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(2U, 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 +1064,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(1U, nav_map->at(multi_frame_test_url).size());
+ ASSERT_EQ(1U, nav_map->at(iframe_url).size());
+ ASSERT_EQ(1U, nav_map->at(iframe_retargeting_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 +1117,28 @@ 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(2U, 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 +1148,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(1U, nav_map->at(multi_frame_test_url).size());
+ ASSERT_EQ(1U, nav_map->at(iframe_url).size());
+ ASSERT_EQ(1U, nav_map->at(iframe_retargeting_url).size());
+ ASSERT_EQ(2U, nav_map->at(blank_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 +1203,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 +1224,207 @@ 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(1U, nav_map->at(redirect_url).size());
+ ASSERT_EQ(1U, nav_map->at(landing_url).size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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 reaching 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(1U, nav_map->at(initial_url).size());
+ ASSERT_EQ(1U, nav_map->at(page_before_landing_referrer_url).size());
+ ASSERT_EQ(1U, nav_map->at(landing_referrer_url).size());
+ ASSERT_EQ(1U, nav_map->at(landing_url).size());
+ ASSERT_EQ(1U, 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 +1434,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(2U, nav_map->size());
+ ASSERT_EQ(1U, nav_map->at(download_url).size());
+ ASSERT_EQ(1U, 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(1U, 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(1U, 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 +1495,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(1U, ip_map->at(test_server_host).size());
+ ClickTestLink("direct_download", 1, initial_url);
+ EXPECT_EQ(1U, 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);

Powered by Google App Engine
This is Rietveld 408576698