Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // This test creates a safebrowsing service using test safebrowsing database | 5 // This test creates a safebrowsing service using test safebrowsing database |
| 6 // and a test protocol manager. It is used to test logics in safebrowsing | 6 // and a test protocol manager. It is used to test logics in safebrowsing |
| 7 // service. | 7 // service. |
| 8 | 8 |
| 9 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 9 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 10 | 10 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 namespace { | 99 namespace { |
| 100 | 100 |
| 101 const char kEmptyPage[] = "/empty.html"; | 101 const char kEmptyPage[] = "/empty.html"; |
| 102 const char kMalwareFile[] = "/downloads/dangerous/dangerous.exe"; | 102 const char kMalwareFile[] = "/downloads/dangerous/dangerous.exe"; |
| 103 const char kMalwarePage[] = "/safe_browsing/malware.html"; | 103 const char kMalwarePage[] = "/safe_browsing/malware.html"; |
| 104 const char kMalwareDelayedLoadsPage[] = | 104 const char kMalwareDelayedLoadsPage[] = |
| 105 "/safe_browsing/malware_delayed_loads.html"; | 105 "/safe_browsing/malware_delayed_loads.html"; |
| 106 const char kMalwareIFrame[] = "/safe_browsing/malware_iframe.html"; | 106 const char kMalwareIFrame[] = "/safe_browsing/malware_iframe.html"; |
| 107 const char kMalwareImg[] = "/safe_browsing/malware_image.png"; | 107 const char kMalwareImg[] = "/safe_browsing/malware_image.png"; |
| 108 const char kNeverCompletesPath[] = "/never_completes"; | 108 const char kNeverCompletesPath[] = "/never_completes"; |
| 109 const char kPrefetchMalwarePage[] = "/safe_browsing/prefetch_malware.html"; | |
| 109 | 110 |
| 110 class MockSubresourceFilterDriver | 111 class MockSubresourceFilterDriver |
| 111 : public subresource_filter::ContentSubresourceFilterDriver { | 112 : public subresource_filter::ContentSubresourceFilterDriver { |
| 112 public: | 113 public: |
| 113 explicit MockSubresourceFilterDriver( | 114 explicit MockSubresourceFilterDriver( |
| 114 content::RenderFrameHost* render_frame_host) | 115 content::RenderFrameHost* render_frame_host) |
| 115 : subresource_filter::ContentSubresourceFilterDriver(render_frame_host) {} | 116 : subresource_filter::ContentSubresourceFilterDriver(render_frame_host) {} |
| 116 | 117 |
| 117 ~MockSubresourceFilterDriver() override = default; | 118 ~MockSubresourceFilterDriver() override = default; |
| 118 | 119 |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 651 return static_cast<FakeSafeBrowsingUIManager*>( | 652 return static_cast<FakeSafeBrowsingUIManager*>( |
| 652 g_browser_process->safe_browsing_service()->ui_manager().get()); | 653 g_browser_process->safe_browsing_service()->ui_manager().get()); |
| 653 } | 654 } |
| 654 bool got_hit_report() { return ui_manager()->got_hit_report_; } | 655 bool got_hit_report() { return ui_manager()->got_hit_report_; } |
| 655 const safe_browsing::HitReport& hit_report() { | 656 const safe_browsing::HitReport& hit_report() { |
| 656 return ui_manager()->hit_report_; | 657 return ui_manager()->hit_report_; |
| 657 } | 658 } |
| 658 | 659 |
| 659 MockSubresourceFilterDriver* driver() { return driver_; } | 660 MockSubresourceFilterDriver* driver() { return driver_; } |
| 660 | 661 |
| 662 class SetPrefetchForTest { | |
| 663 public: | |
| 664 explicit SetPrefetchForTest(bool prefetch) | |
| 665 : old_prerender_mode_(prerender::PrerenderManager::GetMode()) { | |
| 666 std::string exp_group = prefetch ? "ExperimentYes" : "ExperimentNo"; | |
|
Nathan Parker
2017/02/10 01:05:21
I realize you just moved this code, but this seems
| |
| 667 base::FieldTrialList::CreateFieldTrial("Prefetch", exp_group); | |
| 668 | |
| 669 prerender::PrerenderManager::SetMode( | |
| 670 prerender::PrerenderManager::PRERENDER_MODE_DISABLED); | |
| 671 } | |
| 672 | |
| 673 ~SetPrefetchForTest() { | |
| 674 prerender::PrerenderManager::SetMode(old_prerender_mode_); | |
| 675 } | |
| 676 | |
| 677 private: | |
| 678 prerender::PrerenderManager::PrerenderManagerMode old_prerender_mode_; | |
| 679 }; | |
| 680 | |
| 661 protected: | 681 protected: |
| 662 StrictMock<MockObserver> observer_; | 682 StrictMock<MockObserver> observer_; |
| 663 | 683 |
| 664 // Temporary profile dir for test cases that create a second profile. This is | 684 // Temporary profile dir for test cases that create a second profile. This is |
| 665 // owned by the SafeBrowsingServiceTest object so that it will not get | 685 // owned by the SafeBrowsingServiceTest object so that it will not get |
| 666 // destructed until after the test Browser has been torn down, since the | 686 // destructed until after the test Browser has been torn down, since the |
| 667 // ImportantFileWriter may still be modifying it after the Profile object has | 687 // ImportantFileWriter may still be modifying it after the Profile object has |
| 668 // been destroyed. | 688 // been destroyed. |
| 669 base::ScopedTempDir temp_profile_dir_; | 689 base::ScopedTempDir temp_profile_dir_; |
| 670 | 690 |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 852 interstitial_page->Proceed(); | 872 interstitial_page->Proceed(); |
| 853 load_stop_observer.Wait(); | 873 load_stop_observer.Wait(); |
| 854 EXPECT_FALSE(ShowingInterstitialPage()); | 874 EXPECT_FALSE(ShowingInterstitialPage()); |
| 855 | 875 |
| 856 // Navigate to kEmptyPage again -- should hit the whitelist this time. | 876 // Navigate to kEmptyPage again -- should hit the whitelist this time. |
| 857 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(url))).Times(0); | 877 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(url))).Times(0); |
| 858 ui_test_utils::NavigateToURL(browser(), url); | 878 ui_test_utils::NavigateToURL(browser(), url); |
| 859 EXPECT_FALSE(ShowingInterstitialPage()); | 879 EXPECT_FALSE(ShowingInterstitialPage()); |
| 860 } | 880 } |
| 861 | 881 |
| 862 const char kPrefetchMalwarePage[] = "/safe_browsing/prefetch_malware.html"; | |
| 863 | |
| 864 // This test confirms that prefetches don't themselves get the | 882 // This test confirms that prefetches don't themselves get the |
| 865 // interstitial treatment. | 883 // interstitial treatment. |
| 866 IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, Prefetch) { | 884 IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, Prefetch) { |
| 867 GURL url = embedded_test_server()->GetURL(kPrefetchMalwarePage); | 885 GURL url = embedded_test_server()->GetURL(kPrefetchMalwarePage); |
| 868 GURL malware_url = embedded_test_server()->GetURL(kMalwarePage); | 886 GURL malware_url = embedded_test_server()->GetURL(kMalwarePage); |
| 869 | 887 |
| 870 class SetPrefetchForTest { | 888 SetPrefetchForTest instance(true); |
|
Nathan Parker
2017/02/10 01:05:21
nit: maybe scoped_prefetch_setting(true) so it loo
| |
| 871 public: | |
| 872 explicit SetPrefetchForTest(bool prefetch) | |
| 873 : old_prerender_mode_(prerender::PrerenderManager::GetMode()) { | |
| 874 std::string exp_group = prefetch ? "ExperimentYes" : "ExperimentNo"; | |
| 875 base::FieldTrialList::CreateFieldTrial("Prefetch", exp_group); | |
| 876 | |
| 877 prerender::PrerenderManager::SetMode( | |
| 878 prerender::PrerenderManager::PRERENDER_MODE_DISABLED); | |
| 879 } | |
| 880 | |
| 881 ~SetPrefetchForTest() { | |
| 882 prerender::PrerenderManager::SetMode(old_prerender_mode_); | |
| 883 } | |
| 884 | |
| 885 private: | |
| 886 prerender::PrerenderManager::PrerenderManagerMode old_prerender_mode_; | |
| 887 } set_prefetch_for_test(true); | |
| 888 | 889 |
| 889 // Even though we have added this uri to the safebrowsing database and | 890 // Even though we have added this uri to the safebrowsing database and |
| 890 // getfullhash result, we should not see the interstitial page since the | 891 // getfullhash result, we should not see the interstitial page since the |
| 891 // only malware was a prefetch target. | 892 // only malware was a prefetch target. |
| 892 SBFullHashResult malware_full_hash; | 893 SBFullHashResult malware_full_hash; |
| 893 GenUrlFullHashResult(malware_url, MALWARE, &malware_full_hash); | 894 GenUrlFullHashResult(malware_url, MALWARE, &malware_full_hash); |
| 894 SetupResponseForUrl(malware_url, malware_full_hash); | 895 SetupResponseForUrl(malware_url, malware_full_hash); |
| 895 ui_test_utils::NavigateToURL(browser(), url); | 896 ui_test_utils::NavigateToURL(browser(), url); |
| 896 EXPECT_FALSE(ShowingInterstitialPage()); | 897 EXPECT_FALSE(ShowingInterstitialPage()); |
| 897 EXPECT_FALSE(got_hit_report()); | 898 EXPECT_FALSE(got_hit_report()); |
| (...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1979 const GURL& url, | 1980 const GURL& url, |
| 1980 const ListIdentifier& list_id, | 1981 const ListIdentifier& list_id, |
| 1981 ThreatPatternType threat_pattern_type) { | 1982 ThreatPatternType threat_pattern_type) { |
| 1982 FullHashInfo fhi = GetFullHashInfo(url, list_id); | 1983 FullHashInfo fhi = GetFullHashInfo(url, list_id); |
| 1983 fhi.metadata.threat_pattern_type = threat_pattern_type; | 1984 fhi.metadata.threat_pattern_type = threat_pattern_type; |
| 1984 return fhi; | 1985 return fhi; |
| 1985 } | 1986 } |
| 1986 | 1987 |
| 1987 // Sets up the prefix database and the full hash cache to match one of the | 1988 // Sets up the prefix database and the full hash cache to match one of the |
| 1988 // prefixes for the given URL and metadata. | 1989 // prefixes for the given URL and metadata. |
| 1989 void MarkUrlForMalwareUnexpired(const GURL& bad_url, | 1990 void MarkUrlForMalwareUnexpired( |
| 1990 ThreatPatternType threat_pattern_type) { | 1991 const GURL& bad_url, |
| 1992 ThreatPatternType threat_pattern_type = ThreatPatternType::NONE) { | |
| 1991 FullHashInfo full_hash_info = GetFullHashInfoWithMetadata( | 1993 FullHashInfo full_hash_info = GetFullHashInfoWithMetadata( |
| 1992 bad_url, GetUrlMalwareId(), threat_pattern_type); | 1994 bad_url, GetUrlMalwareId(), threat_pattern_type); |
| 1993 | 1995 |
| 1994 v4_db_factory_->MarkPrefixAsBad(GetUrlMalwareId(), | 1996 v4_db_factory_->MarkPrefixAsBad(GetUrlMalwareId(), |
| 1995 full_hash_info.full_hash); | 1997 full_hash_info.full_hash); |
| 1996 v4_get_hash_factory_->AddToFullHashCache(full_hash_info); | 1998 v4_get_hash_factory_->AddToFullHashCache(full_hash_info); |
| 1997 } | 1999 } |
| 1998 | 2000 |
| 1999 // Sets up the prefix database and the full hash cache to match one of the | 2001 // Sets up the prefix database and the full hash cache to match one of the |
| 2000 // prefixes for the given URL. | 2002 // prefixes for the given URL. |
| 2001 void MarkUrlForUwsUnexpired(const GURL& bad_url) { | 2003 void MarkUrlForUwsUnexpired(const GURL& bad_url) { |
| 2002 FullHashInfo full_hash_info = GetFullHashInfo(bad_url, GetUrlUwsId()); | 2004 FullHashInfo full_hash_info = GetFullHashInfo(bad_url, GetUrlUwsId()); |
| 2003 v4_db_factory_->MarkPrefixAsBad(GetUrlUwsId(), full_hash_info.full_hash); | 2005 v4_db_factory_->MarkPrefixAsBad(GetUrlUwsId(), full_hash_info.full_hash); |
| 2004 v4_get_hash_factory_->AddToFullHashCache(full_hash_info); | 2006 v4_get_hash_factory_->AddToFullHashCache(full_hash_info); |
| 2005 } | 2007 } |
| 2006 | 2008 |
| 2009 void MarkUrlForPhishingUnexpired(const GURL& bad_url, | |
| 2010 ThreatPatternType threat_pattern_type) { | |
| 2011 FullHashInfo full_hash_info = GetFullHashInfoWithMetadata( | |
| 2012 bad_url, GetUrlSocEngId(), threat_pattern_type); | |
| 2013 | |
| 2014 v4_db_factory_->MarkPrefixAsBad(GetUrlSocEngId(), full_hash_info.full_hash); | |
| 2015 v4_get_hash_factory_->AddToFullHashCache(full_hash_info); | |
| 2016 } | |
| 2017 | |
| 2007 private: | 2018 private: |
| 2008 // Owned by the V4Database. | 2019 // Owned by the V4Database. |
| 2009 TestV4DatabaseFactory* v4_db_factory_; | 2020 TestV4DatabaseFactory* v4_db_factory_; |
| 2010 // Owned by the V4GetHashProtocolManager. | 2021 // Owned by the V4GetHashProtocolManager. |
| 2011 TestV4GetHashProtocolManagerFactory* v4_get_hash_factory_; | 2022 TestV4GetHashProtocolManagerFactory* v4_get_hash_factory_; |
| 2012 | 2023 |
| 2013 DISALLOW_COPY_AND_ASSIGN(V4SafeBrowsingServiceTest); | 2024 DISALLOW_COPY_AND_ASSIGN(V4SafeBrowsingServiceTest); |
| 2014 }; | 2025 }; |
| 2015 | 2026 |
| 2016 // Ensures that if an image is marked as UwS, the main page doesn't show an | 2027 // Ensures that if an image is marked as UwS, the main page doesn't show an |
| 2017 // interstitial. | 2028 // interstitial. |
| 2018 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, UnwantedImgIgnored) { | 2029 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, UnwantedImgIgnored) { |
| 2019 GURL main_url = embedded_test_server()->GetURL(kMalwarePage); | 2030 GURL main_url = embedded_test_server()->GetURL(kMalwarePage); |
| 2020 GURL img_url = embedded_test_server()->GetURL(kMalwareImg); | 2031 GURL img_url = embedded_test_server()->GetURL(kMalwareImg); |
| 2021 | 2032 |
| 2022 // Add the img url as coming from a site serving UwS and then load the parent | 2033 // Add the img url as coming from a site serving UwS and then load the parent |
| 2023 // page. | 2034 // page. |
| 2024 MarkUrlForUwsUnexpired(img_url); | 2035 MarkUrlForUwsUnexpired(img_url); |
| 2025 | 2036 |
| 2026 ui_test_utils::NavigateToURL(browser(), main_url); | 2037 ui_test_utils::NavigateToURL(browser(), main_url); |
| 2027 | 2038 |
| 2028 EXPECT_FALSE(ShowingInterstitialPage()); | 2039 EXPECT_FALSE(ShowingInterstitialPage()); |
| 2029 EXPECT_FALSE(got_hit_report()); | 2040 EXPECT_FALSE(got_hit_report()); |
| 2030 } | 2041 } |
| 2031 | 2042 |
| 2043 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, MalwareWithWhitelist) { | |
| 2044 GURL url = embedded_test_server()->GetURL(kEmptyPage); | |
| 2045 | |
| 2046 // After adding the url to safebrowsing database and getfullhash result, | |
| 2047 // we should see the interstitial page. | |
| 2048 MarkUrlForMalwareUnexpired(url); | |
| 2049 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(url))).Times(1); | |
| 2050 | |
| 2051 ui_test_utils::NavigateToURL(browser(), url); | |
| 2052 Mock::VerifyAndClearExpectations(&observer_); | |
| 2053 // There should be an InterstitialPage. | |
| 2054 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); | |
| 2055 InterstitialPage* interstitial_page = contents->GetInterstitialPage(); | |
| 2056 ASSERT_TRUE(interstitial_page); | |
| 2057 // Proceed through it. | |
| 2058 content::WindowedNotificationObserver load_stop_observer( | |
| 2059 content::NOTIFICATION_LOAD_STOP, | |
| 2060 content::Source<content::NavigationController>( | |
| 2061 &contents->GetController())); | |
| 2062 interstitial_page->Proceed(); | |
| 2063 load_stop_observer.Wait(); | |
| 2064 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2065 | |
| 2066 // Navigate to kEmptyPage again -- should hit the whitelist this time. | |
| 2067 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(url))).Times(0); | |
| 2068 ui_test_utils::NavigateToURL(browser(), url); | |
| 2069 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2070 } | |
| 2071 | |
| 2072 // This test confirms that prefetches don't themselves get the | |
| 2073 // interstitial treatment. | |
| 2074 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, Prefetch) { | |
| 2075 GURL url = embedded_test_server()->GetURL(kPrefetchMalwarePage); | |
| 2076 GURL malware_url = embedded_test_server()->GetURL(kMalwarePage); | |
| 2077 | |
| 2078 SetPrefetchForTest instance(true); | |
| 2079 | |
| 2080 // Even though we have added this URI to the SafeBrowsing database and | |
| 2081 // full hash result, we should not see the interstitial page since the | |
| 2082 // only malware was a prefetch target. | |
| 2083 MarkUrlForMalwareUnexpired(malware_url); | |
| 2084 | |
| 2085 ui_test_utils::NavigateToURL(browser(), url); | |
| 2086 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2087 EXPECT_FALSE(got_hit_report()); | |
| 2088 Mock::VerifyAndClear(&observer_); | |
| 2089 | |
| 2090 // However, when we navigate to the malware page, we should still get | |
| 2091 // the interstitial. | |
| 2092 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(malware_url))) | |
| 2093 .Times(1); | |
| 2094 ui_test_utils::NavigateToURL(browser(), malware_url); | |
| 2095 EXPECT_TRUE(ShowingInterstitialPage()); | |
| 2096 EXPECT_TRUE(got_hit_report()); | |
| 2097 Mock::VerifyAndClear(&observer_); | |
| 2098 } | |
| 2099 | |
| 2100 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, MainFrameHitWithReferrer) { | |
| 2101 GURL first_url = embedded_test_server()->GetURL(kEmptyPage); | |
| 2102 GURL bad_url = embedded_test_server()->GetURL(kMalwarePage); | |
| 2103 | |
| 2104 MarkUrlForMalwareUnexpired(bad_url); | |
| 2105 | |
| 2106 // Navigate to first, safe page. | |
| 2107 ui_test_utils::NavigateToURL(browser(), first_url); | |
| 2108 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2109 EXPECT_FALSE(got_hit_report()); | |
| 2110 Mock::VerifyAndClear(&observer_); | |
| 2111 | |
| 2112 // Navigate to malware page, should show interstitial and have first page in | |
| 2113 // referrer. | |
| 2114 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(bad_url))) | |
| 2115 .Times(1); | |
| 2116 | |
| 2117 chrome::NavigateParams params(browser(), bad_url, ui::PAGE_TRANSITION_LINK); | |
| 2118 params.referrer.url = first_url; | |
| 2119 ui_test_utils::NavigateToURL(¶ms); | |
| 2120 | |
| 2121 EXPECT_TRUE(ShowingInterstitialPage()); | |
| 2122 EXPECT_TRUE(got_hit_report()); | |
| 2123 EXPECT_EQ(bad_url, hit_report().malicious_url); | |
| 2124 EXPECT_EQ(bad_url, hit_report().page_url); | |
| 2125 EXPECT_EQ(first_url, hit_report().referrer_url); | |
| 2126 EXPECT_FALSE(hit_report().is_subresource); | |
| 2127 } | |
| 2128 | |
| 2129 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, | |
| 2130 SocEngReportingBlacklistNotEmpty) { | |
| 2131 subresource_filter::testing::ScopedSubresourceFilterFeatureToggle | |
| 2132 scoped_feature_toggle( | |
| 2133 base::FeatureList::OVERRIDE_ENABLE_FEATURE, | |
| 2134 subresource_filter::kActivationLevelEnabled, | |
| 2135 subresource_filter::kActivationScopeActivationList, | |
| 2136 subresource_filter::kActivationListSocialEngineeringAdsInterstitial); | |
| 2137 // Tests that when Safe Browsing gets hit which is corresponding to the | |
| 2138 // SOCIAL_ENGINEERING_ADS threat type, then URL is added to the Subresource | |
| 2139 // Filter. | |
| 2140 GURL bad_url = embedded_test_server()->GetURL(kMalwarePage); | |
| 2141 MarkUrlForPhishingUnexpired(bad_url, | |
| 2142 ThreatPatternType::SOCIAL_ENGINEERING_ADS); | |
| 2143 | |
| 2144 WebContents* main_contents = | |
| 2145 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 2146 | |
| 2147 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(bad_url))) | |
| 2148 .Times(1); | |
| 2149 EXPECT_CALL(*driver(), ActivateForProvisionalLoad(::testing::_, ::testing::_, | |
| 2150 ::testing::_)) | |
| 2151 .Times(0); | |
| 2152 ui_test_utils::NavigateToURL(browser(), bad_url); | |
| 2153 Mock::VerifyAndClearExpectations(&observer_); | |
| 2154 ASSERT_TRUE(got_hit_report()); | |
| 2155 | |
| 2156 content::WaitForInterstitialAttach(main_contents); | |
| 2157 EXPECT_TRUE(ShowingInterstitialPage()); | |
| 2158 testing::Mock::VerifyAndClearExpectations(driver()); | |
| 2159 EXPECT_CALL(*driver(), ActivateForProvisionalLoad(::testing::_, ::testing::_, | |
| 2160 ::testing::_)) | |
| 2161 .Times(1); | |
| 2162 InterstitialPage* interstitial_page = main_contents->GetInterstitialPage(); | |
| 2163 ASSERT_TRUE(interstitial_page); | |
| 2164 interstitial_page->Proceed(); | |
| 2165 content::WaitForInterstitialDetach(main_contents); | |
| 2166 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2167 testing::Mock::VerifyAndClearExpectations(driver()); | |
| 2168 } | |
| 2169 | |
| 2170 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, | |
| 2171 SocEngReportingBlacklistEmpty) { | |
| 2172 // Tests that URLS which doesn't belong to the SOCIAL_ENGINEERING_ADS threat | |
| 2173 // type aren't seen by the Subresource Filter. | |
| 2174 subresource_filter::testing::ScopedSubresourceFilterFeatureToggle | |
| 2175 scoped_feature_toggle( | |
| 2176 base::FeatureList::OVERRIDE_ENABLE_FEATURE, | |
| 2177 subresource_filter::kActivationLevelEnabled, | |
| 2178 subresource_filter::kActivationScopeNoSites, | |
| 2179 subresource_filter::kActivationListSocialEngineeringAdsInterstitial); | |
| 2180 | |
| 2181 GURL bad_url = embedded_test_server()->base_url().Resolve(kMalwarePage); | |
| 2182 MarkUrlForMalwareUnexpired(bad_url); | |
| 2183 | |
| 2184 WebContents* main_contents = | |
| 2185 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 2186 | |
| 2187 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(bad_url))) | |
| 2188 .Times(1); | |
| 2189 EXPECT_CALL(*driver(), ActivateForProvisionalLoad(::testing::_, ::testing::_, | |
|
Nathan Parker
2017/02/10 01:05:21
You've already got a "using" for this, so just s/:
| |
| 2190 ::testing::_)) | |
| 2191 .Times(0); | |
| 2192 ui_test_utils::NavigateToURL(browser(), bad_url); | |
| 2193 testing::Mock::VerifyAndClearExpectations(driver()); | |
| 2194 ASSERT_TRUE(got_hit_report()); | |
| 2195 | |
| 2196 content::WaitForInterstitialAttach(main_contents); | |
| 2197 EXPECT_TRUE(ShowingInterstitialPage()); | |
| 2198 testing::Mock::VerifyAndClearExpectations(driver()); | |
| 2199 EXPECT_CALL(*driver(), ActivateForProvisionalLoad(::testing::_, ::testing::_, | |
| 2200 ::testing::_)) | |
| 2201 .Times(0); | |
| 2202 InterstitialPage* interstitial_page = main_contents->GetInterstitialPage(); | |
| 2203 ASSERT_TRUE(interstitial_page); | |
| 2204 interstitial_page->Proceed(); | |
| 2205 content::WaitForInterstitialDetach(main_contents); | |
| 2206 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2207 testing::Mock::VerifyAndClearExpectations(driver()); | |
| 2208 } | |
| 2209 | |
| 2210 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, | |
| 2211 SubResourceHitWithMainFrameReferrer) { | |
| 2212 GURL first_url = embedded_test_server()->GetURL(kEmptyPage); | |
| 2213 GURL second_url = embedded_test_server()->GetURL(kMalwarePage); | |
| 2214 GURL bad_url = embedded_test_server()->GetURL(kMalwareImg); | |
| 2215 | |
| 2216 MarkUrlForMalwareUnexpired(bad_url); | |
| 2217 | |
| 2218 // Navigate to first, safe page. | |
| 2219 ui_test_utils::NavigateToURL(browser(), first_url); | |
| 2220 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2221 EXPECT_FALSE(got_hit_report()); | |
| 2222 Mock::VerifyAndClear(&observer_); | |
| 2223 | |
| 2224 // Navigate to page which has malware subresource, should show interstitial | |
| 2225 // and have first page in referrer. | |
| 2226 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(bad_url))) | |
| 2227 .Times(1); | |
| 2228 | |
| 2229 chrome::NavigateParams params(browser(), second_url, | |
| 2230 ui::PAGE_TRANSITION_LINK); | |
| 2231 params.referrer.url = first_url; | |
| 2232 ui_test_utils::NavigateToURL(¶ms); | |
| 2233 | |
| 2234 EXPECT_TRUE(ShowingInterstitialPage()); | |
| 2235 EXPECT_TRUE(got_hit_report()); | |
| 2236 EXPECT_EQ(bad_url, hit_report().malicious_url); | |
| 2237 EXPECT_EQ(second_url, hit_report().page_url); | |
| 2238 EXPECT_EQ(first_url, hit_report().referrer_url); | |
| 2239 EXPECT_TRUE(hit_report().is_subresource); | |
| 2240 } | |
| 2241 | |
| 2242 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, | |
| 2243 SubResourceHitWithMainFrameRendererInitiatedSlowLoad) { | |
| 2244 GURL first_url = embedded_test_server()->GetURL(kEmptyPage); | |
| 2245 GURL second_url = embedded_test_server()->GetURL(kMalwareDelayedLoadsPage); | |
| 2246 GURL third_url = embedded_test_server()->GetURL(kNeverCompletesPath); | |
| 2247 GURL bad_url = embedded_test_server()->GetURL(kMalwareImg); | |
| 2248 | |
| 2249 MarkUrlForMalwareUnexpired(bad_url); | |
| 2250 | |
| 2251 // Navigate to first, safe page. | |
| 2252 ui_test_utils::NavigateToURL(browser(), first_url); | |
| 2253 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2254 EXPECT_FALSE(got_hit_report()); | |
| 2255 Mock::VerifyAndClear(&observer_); | |
| 2256 | |
| 2257 // Navigate to malware page. The malware subresources haven't loaded yet, so | |
| 2258 // no interstitial should show yet. | |
| 2259 chrome::NavigateParams params(browser(), second_url, | |
| 2260 ui::PAGE_TRANSITION_LINK); | |
| 2261 params.referrer.url = first_url; | |
| 2262 ui_test_utils::NavigateToURL(¶ms); | |
| 2263 | |
| 2264 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2265 EXPECT_FALSE(got_hit_report()); | |
| 2266 Mock::VerifyAndClear(&observer_); | |
| 2267 | |
| 2268 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(bad_url))) | |
| 2269 .Times(1); | |
| 2270 | |
| 2271 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); | |
| 2272 content::WindowedNotificationObserver load_stop_observer( | |
| 2273 content::NOTIFICATION_LOAD_STOP, | |
| 2274 content::Source<content::NavigationController>( | |
| 2275 &contents->GetController())); | |
| 2276 // Run javascript function in the page which starts a timer to load the | |
| 2277 // malware image, and also starts a renderer-initiated top-level navigation to | |
| 2278 // a site that does not respond. Should show interstitial and have first page | |
| 2279 // in referrer. | |
| 2280 contents->GetMainFrame()->ExecuteJavaScriptForTests( | |
| 2281 base::ASCIIToUTF16("navigateAndLoadMalwareImage()")); | |
| 2282 load_stop_observer.Wait(); | |
| 2283 | |
| 2284 EXPECT_TRUE(ShowingInterstitialPage()); | |
| 2285 EXPECT_TRUE(got_hit_report()); | |
| 2286 // Report URLs should be for the current page, not the pending load. | |
| 2287 EXPECT_EQ(bad_url, hit_report().malicious_url); | |
| 2288 EXPECT_EQ(second_url, hit_report().page_url); | |
| 2289 EXPECT_EQ(first_url, hit_report().referrer_url); | |
| 2290 EXPECT_TRUE(hit_report().is_subresource); | |
| 2291 } | |
| 2292 | |
| 2293 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, | |
| 2294 SubResourceHitWithMainFrameBrowserInitiatedSlowLoad) { | |
| 2295 GURL first_url = embedded_test_server()->GetURL(kEmptyPage); | |
| 2296 GURL second_url = embedded_test_server()->GetURL(kMalwareDelayedLoadsPage); | |
| 2297 GURL third_url = embedded_test_server()->GetURL(kNeverCompletesPath); | |
| 2298 GURL bad_url = embedded_test_server()->GetURL(kMalwareImg); | |
| 2299 | |
| 2300 MarkUrlForMalwareUnexpired(bad_url); | |
| 2301 | |
| 2302 // Navigate to first, safe page. | |
| 2303 ui_test_utils::NavigateToURL(browser(), first_url); | |
| 2304 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2305 EXPECT_FALSE(got_hit_report()); | |
| 2306 Mock::VerifyAndClear(&observer_); | |
| 2307 | |
| 2308 // Navigate to malware page. The malware subresources haven't loaded yet, so | |
| 2309 // no interstitial should show yet. | |
| 2310 chrome::NavigateParams params(browser(), second_url, | |
| 2311 ui::PAGE_TRANSITION_LINK); | |
| 2312 params.referrer.url = first_url; | |
| 2313 ui_test_utils::NavigateToURL(¶ms); | |
| 2314 | |
| 2315 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2316 EXPECT_FALSE(got_hit_report()); | |
| 2317 Mock::VerifyAndClear(&observer_); | |
| 2318 | |
| 2319 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(bad_url))) | |
| 2320 .Times(1); | |
| 2321 | |
| 2322 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); | |
| 2323 content::RenderFrameHost* rfh = contents->GetMainFrame(); | |
| 2324 content::WindowedNotificationObserver load_stop_observer( | |
| 2325 content::NOTIFICATION_LOAD_STOP, | |
| 2326 content::Source<content::NavigationController>( | |
| 2327 &contents->GetController())); | |
| 2328 // Start a browser initiated top-level navigation to a site that does not | |
| 2329 // respond. | |
| 2330 ui_test_utils::NavigateToURLWithDisposition( | |
| 2331 browser(), third_url, WindowOpenDisposition::CURRENT_TAB, | |
| 2332 ui_test_utils::BROWSER_TEST_NONE); | |
| 2333 | |
| 2334 // While the top-level navigation is pending, run javascript | |
| 2335 // function in the page which loads the malware image. | |
| 2336 rfh->ExecuteJavaScriptForTests(base::ASCIIToUTF16("loadMalwareImage()")); | |
| 2337 | |
| 2338 // Wait for interstitial to show. | |
| 2339 load_stop_observer.Wait(); | |
| 2340 | |
| 2341 EXPECT_TRUE(ShowingInterstitialPage()); | |
| 2342 EXPECT_TRUE(got_hit_report()); | |
| 2343 // Report URLs should be for the current page, not the pending load. | |
| 2344 EXPECT_EQ(bad_url, hit_report().malicious_url); | |
| 2345 EXPECT_EQ(second_url, hit_report().page_url); | |
| 2346 EXPECT_EQ(first_url, hit_report().referrer_url); | |
| 2347 EXPECT_TRUE(hit_report().is_subresource); | |
| 2348 } | |
| 2349 | |
| 2350 IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, SubResourceHitOnFreshTab) { | |
| 2351 // Allow popups. | |
| 2352 HostContentSettingsMapFactory::GetForProfile(browser()->profile()) | |
| 2353 ->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_POPUPS, | |
| 2354 CONTENT_SETTING_ALLOW); | |
| 2355 | |
| 2356 // Add |kMalwareImg| to fake safebrowsing db. | |
| 2357 GURL img_url = embedded_test_server()->GetURL(kMalwareImg); | |
| 2358 MarkUrlForMalwareUnexpired(img_url); | |
| 2359 | |
| 2360 // Have the current tab open a new tab with window.open(). | |
| 2361 WebContents* main_contents = | |
| 2362 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 2363 content::RenderFrameHost* main_rfh = main_contents->GetMainFrame(); | |
| 2364 | |
| 2365 content::WebContentsAddedObserver web_contents_added_observer; | |
| 2366 main_rfh->ExecuteJavaScriptForTests(base::ASCIIToUTF16("w=window.open();")); | |
| 2367 WebContents* new_tab_contents = web_contents_added_observer.GetWebContents(); | |
| 2368 content::RenderFrameHost* new_tab_rfh = new_tab_contents->GetMainFrame(); | |
| 2369 // A fresh WebContents should not have any NavigationEntries yet. (See | |
| 2370 // https://crbug.com/524208.) | |
| 2371 EXPECT_EQ(nullptr, new_tab_contents->GetController().GetLastCommittedEntry()); | |
| 2372 EXPECT_EQ(nullptr, new_tab_contents->GetController().GetPendingEntry()); | |
| 2373 | |
| 2374 // Run javascript in the blank new tab to load the malware image. | |
| 2375 EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(img_url))) | |
| 2376 .Times(1); | |
| 2377 new_tab_rfh->ExecuteJavaScriptForTests( | |
| 2378 base::ASCIIToUTF16("var img=new Image();" | |
| 2379 "img.src=\"" + | |
| 2380 img_url.spec() + "\";" | |
| 2381 "document.body.appendChild(img);")); | |
| 2382 | |
| 2383 // Wait for interstitial to show. | |
| 2384 content::WaitForInterstitialAttach(new_tab_contents); | |
| 2385 Mock::VerifyAndClearExpectations(&observer_); | |
| 2386 EXPECT_TRUE(ShowingInterstitialPage()); | |
| 2387 EXPECT_TRUE(got_hit_report()); | |
| 2388 EXPECT_EQ(img_url, hit_report().malicious_url); | |
| 2389 EXPECT_TRUE(hit_report().is_subresource); | |
| 2390 // Page report URLs should be empty, since there is no URL for this page. | |
| 2391 EXPECT_EQ(GURL(), hit_report().page_url); | |
| 2392 EXPECT_EQ(GURL(), hit_report().referrer_url); | |
| 2393 | |
| 2394 // Proceed through it. | |
| 2395 InterstitialPage* interstitial_page = new_tab_contents->GetInterstitialPage(); | |
| 2396 ASSERT_TRUE(interstitial_page); | |
| 2397 interstitial_page->Proceed(); | |
| 2398 | |
| 2399 content::WaitForInterstitialDetach(new_tab_contents); | |
| 2400 EXPECT_FALSE(ShowingInterstitialPage()); | |
| 2401 } | |
| 2402 | |
| 2032 // TODO(vakh): Add test for UnwantedMainFrame. | 2403 // TODO(vakh): Add test for UnwantedMainFrame. |
| 2033 | 2404 |
| 2034 class V4SafeBrowsingServiceMetadataTest | 2405 class V4SafeBrowsingServiceMetadataTest |
| 2035 : public V4SafeBrowsingServiceTest, | 2406 : public V4SafeBrowsingServiceTest, |
| 2036 public ::testing::WithParamInterface<ThreatPatternType> { | 2407 public ::testing::WithParamInterface<ThreatPatternType> { |
| 2037 public: | 2408 public: |
| 2038 V4SafeBrowsingServiceMetadataTest() {} | 2409 V4SafeBrowsingServiceMetadataTest() {} |
| 2039 | 2410 |
| 2040 private: | 2411 private: |
| 2041 DISALLOW_COPY_AND_ASSIGN(V4SafeBrowsingServiceMetadataTest); | 2412 DISALLOW_COPY_AND_ASSIGN(V4SafeBrowsingServiceMetadataTest); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2129 } | 2500 } |
| 2130 | 2501 |
| 2131 INSTANTIATE_TEST_CASE_P( | 2502 INSTANTIATE_TEST_CASE_P( |
| 2132 MaybeSetMetadata, | 2503 MaybeSetMetadata, |
| 2133 V4SafeBrowsingServiceMetadataTest, | 2504 V4SafeBrowsingServiceMetadataTest, |
| 2134 testing::Values(ThreatPatternType::NONE, | 2505 testing::Values(ThreatPatternType::NONE, |
| 2135 ThreatPatternType::MALWARE_LANDING, | 2506 ThreatPatternType::MALWARE_LANDING, |
| 2136 ThreatPatternType::MALWARE_DISTRIBUTION)); | 2507 ThreatPatternType::MALWARE_DISTRIBUTION)); |
| 2137 | 2508 |
| 2138 } // namespace safe_browsing | 2509 } // namespace safe_browsing |
| OLD | NEW |