| 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 e5ce193f1633e2b403d80af40fd60b047a9cb103..1e405c1ef32643b476a9568c05115e01bff76ea7 100644
|
| --- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc
|
| +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc
|
| @@ -250,14 +250,14 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest {
|
| EXPECT_EQ(expected_is_retargeting, actual_entry.is_retargeting());
|
| }
|
|
|
| - std::vector<ReferrerChainEntry> IdentifyReferrerChain(
|
| + std::vector<ReferrerChainEntry> IdentifyReferrerChainForDownload(
|
| 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(
|
| + EXPECT_LE(observer_manager_->IdentifyReferrerChainForDownload(
|
| download->GetURL(), download_tab_id,
|
| 2, // kDownloadAttributionUserGestureLimit
|
| &referrer_chain),
|
| @@ -265,6 +265,23 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest {
|
| return referrer_chain;
|
| }
|
|
|
| + std::vector<ReferrerChainEntry> IdentifyReferrerChainForPPAPIDownload(
|
| + const GURL& initiating_frame_url,
|
| + content::WebContents* web_contents) {
|
| + std::vector<ReferrerChainEntry> referrer_chain;
|
| + int tab_id = SessionTabHelper::IdForTab(web_contents);
|
| + bool has_user_gesture = observer_manager_->HasUserGesture(web_contents);
|
| + observer_manager_->OnUserGestureConsumed(web_contents, base::Time::Now());
|
| + EXPECT_LE(observer_manager_->IdentifyReferrerChainForPPAPIDownload(
|
| + initiating_frame_url,
|
| + tab_id,
|
| + has_user_gesture,
|
| + 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_.
|
| @@ -278,6 +295,12 @@ class SBNavigationObserverBrowserTest : public InProcessBrowserTest {
|
| ip_list.back().ip);
|
| }
|
|
|
| + void SimulateUserGesture(){
|
| + observer_manager_->RecordUserGestureForWebContents(
|
| + browser()->tab_strip_model()->GetActiveWebContents(),
|
| + base::Time::Now());
|
| + }
|
| +
|
| SafeBrowsingNavigationObserverManager::NavigationMap* navigation_map() {
|
| return observer_manager_->navigation_map();
|
| }
|
| @@ -324,7 +347,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, TypeInURLDownload) {
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(1U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -363,7 +386,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, DirectDownload) {
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(2U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -412,7 +435,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(2U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -475,7 +498,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(1));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(2U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -536,7 +559,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(std::size_t(3), referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -613,7 +636,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(std::size_t(3), referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -691,7 +714,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(std::size_t(4), referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -753,7 +776,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| false, // has_server_redirect
|
| nav_map->at(download_url).at(0));
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(2U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -812,7 +835,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, MixRedirects) {
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(std::size_t(3), referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -891,7 +914,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, NewTabDownload) {
|
| nav_map->at(download_url).at(0).target_tab_id);
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(std::size_t(3), referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -972,7 +995,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0).target_tab_id);
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(std::size_t(3), referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -1033,7 +1056,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(2U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -1116,7 +1139,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(4U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -1231,7 +1254,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| EXPECT_EQ(5U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -1321,7 +1344,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, CompleteReferrerChain) {
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| EXPECT_EQ(std::size_t(4), referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -1420,7 +1443,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| nav_map->at(download_url).at(0));
|
| VerifyHostToIpMap();
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| EXPECT_EQ(std::size_t(3), referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -1447,6 +1470,146 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| // page_before_landing_referrer_url is not in referrer chain.
|
| }
|
|
|
| +// Click a link which redirects to a PPAPI landing page.
|
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| + PPAPIDownloadWithUserGestureOnHostingFrame) {
|
| + 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);
|
| + std::string test_server_ip(embedded_test_server()->host_port_pair().host());
|
| +
|
| + // Simulate a user gesture on landing page.
|
| + SimulateUserGesture();
|
| + auto nav_map = navigation_map();
|
| + ASSERT_TRUE(nav_map);
|
| + ASSERT_EQ(std::size_t(3), 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(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));
|
| + VerifyHostToIpMap();
|
| +
|
| + auto referrer_chain = IdentifyReferrerChainForPPAPIDownload(
|
| + landing_url, browser()->tab_strip_model()->GetActiveWebContents());
|
| +
|
| + EXPECT_EQ(std::size_t(3), referrer_chain.size());
|
| + 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[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_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]);
|
| +}
|
| +
|
| +// Click a link which redirects to a page that triggers PPAPI download without
|
| +// user gesture (a.k.a not a landing page).
|
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| + PPAPIDownloadWithoutUserGestureOnHostingFrame) {
|
| + GURL landing_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
|
| + ClickTestLink("complete_referrer_chain", 2, landing_url);
|
| + GURL redirect_url = embedded_test_server()->GetURL(kRedirectToLandingURL);
|
| + GURL hosting_url = embedded_test_server()->GetURL(kLandingURL);
|
| + 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(1U, nav_map->at(redirect_url).size());
|
| + ASSERT_EQ(1U, nav_map->at(hosting_url).size());
|
| + ASSERT_EQ(1U, nav_map->at(landing_url).size());
|
| + VerifyNavigationEvent(GURL(), // source_url
|
| + GURL(), // source_main_frame_url
|
| + 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
|
| + 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
|
| + hosting_url, // original_request_url
|
| + hosting_url, // destination_url
|
| + false, // is_user_initiated,
|
| + true, // has_committed
|
| + false, // has_server_redirect
|
| + nav_map->at(hosting_url).at(0));
|
| + VerifyHostToIpMap();
|
| +
|
| + auto referrer_chain = IdentifyReferrerChainForPPAPIDownload(
|
| + hosting_url, browser()->tab_strip_model()->GetActiveWebContents());
|
| +
|
| + EXPECT_EQ(std::size_t(3), referrer_chain.size());
|
| + VerifyReferrerChainEntry(hosting_url, // url
|
| + ReferrerChainEntry::CLIENT_REDIRECT, // 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
|
| + landing_url, // referrer_url
|
| + landing_url, // referrer_main_frame_url
|
| + false, // is_retargeting
|
| + referrer_chain[1]);
|
| + VerifyReferrerChainEntry(landing_url, // url
|
| + ReferrerChainEntry::LANDING_PAGE, // type
|
| + test_server_ip, // ip_address
|
| + GURL(), // no more referrer before landing_url
|
| + GURL(),
|
| + false, // is_retargeting
|
| + referrer_chain[2]);
|
| +}
|
| +
|
| // Server-side redirect.
|
| IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, ServerRedirect) {
|
| GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
|
| @@ -1477,7 +1640,7 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, ServerRedirect) {
|
| true, // has_server_redirect
|
| nav_map->at(download_url).at(0));
|
|
|
| - auto referrer_chain = IdentifyReferrerChain(GetDownload());
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(GetDownload());
|
| ASSERT_EQ(1U, referrer_chain.size());
|
| VerifyReferrerChainEntry(download_url, // url
|
| ReferrerChainEntry::DOWNLOAD_URL, // type
|
| @@ -1488,6 +1651,64 @@ IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, ServerRedirect) {
|
| referrer_chain[0]);
|
| }
|
|
|
| +// Retargeting immediately followed by server-side redirect.
|
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
|
| + RetargetingAndServerRedirect) {
|
| + GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
|
| + GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
|
| + GURL request_url =
|
| + embedded_test_server()->GetURL("/server-redirect?" + download_url.spec());
|
| + ClickTestLink("new_tab_download_with_server_redirect", 1, initial_url);
|
| + std::string test_server_ip(embedded_test_server()->host_port_pair().host());
|
| + auto nav_map = navigation_map();
|
| + ASSERT_TRUE(nav_map);
|
| + ASSERT_EQ(3U, nav_map->size());
|
| + ASSERT_EQ(1U, nav_map->at(request_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
|
| + request_url, // original_request_url
|
| + request_url, // destination_url
|
| + true, // is_user_initiated,
|
| + false, // has_committed
|
| + false, // has_server_redirect
|
| + nav_map->at(request_url).at(0));
|
| + VerifyNavigationEvent(GURL(), // source_url
|
| + GURL(), // source_main_frame_url
|
| + request_url, // original_request_url
|
| + download_url, // destination_url
|
| + false, // is_user_initiated,
|
| + false, // has_committed
|
| + true, // has_server_redirect
|
| + nav_map->at(download_url).at(0));
|
| +
|
| + auto referrer_chain = IdentifyReferrerChainForDownload(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]);
|
| +}
|
| +
|
| // 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);
|
|
|