blob: 89485548215ba4923600b8db8c5077c32de25e4f [file] [log] [blame]
feltbc2eda2d2015-06-23 02:06:031// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
dcheng7bacc0e2016-04-11 20:10:545#include "chrome/browser/safe_browsing/ui_manager.h"
6
Sebastien Marchandf1349f52019-01-25 03:16:417#include "base/bind.h"
Carlos ILe7464b9c2020-01-18 01:38:308#include "base/bind_helpers.h"
clamy4edbf0e2015-12-02 13:35:419#include "base/run_loop.h"
Eric Seckler8652dcd52018-09-20 10:42:2810#include "base/task/post_task.h"
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3211#include "chrome/browser/net/system_network_context_manager.h"
dalecurtis6c58ed02016-10-28 23:02:3712#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
Luke Zielinski12ef88552017-06-23 15:36:2713#include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
Findit86f6ae0fa2017-09-28 02:19:0114#include "chrome/browser/safe_browsing/ui_manager.h"
feltfb118572015-08-18 05:22:0115#include "chrome/test/base/chrome_render_view_host_test_harness.h"
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3216#include "chrome/test/base/scoped_testing_local_state.h"
Luke Zielinski12ef88552017-06-23 15:36:2717#include "chrome/test/base/testing_browser_process.h"
feltfb118572015-08-18 05:22:0118#include "chrome/test/base/testing_profile.h"
Ali Jumafb3dc1f2020-01-07 17:33:4719#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
20#include "components/safe_browsing/core/db/util.h"
Ali Jumaee602932020-01-24 16:39:1821#include "components/security_interstitials/content/unsafe_resource_util.h"
edwardjungd7395fb02017-05-12 23:13:2922#include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
Ali Jumaee602932020-01-24 16:39:1823#include "components/security_interstitials/core/unsafe_resource.h"
Eric Seckler8652dcd52018-09-20 10:42:2824#include "content/public/browser/browser_task_traits.h"
estark1ca09ca2016-11-01 04:04:1225#include "content/public/browser/navigation_entry.h"
Lukasz Anforowiczb55fc492017-10-02 18:38:3426#include "content/public/browser/render_frame_host.h"
feltfb118572015-08-18 05:22:0127#include "content/public/browser/render_process_host.h"
28#include "content/public/browser/render_view_host.h"
29#include "content/public/browser/web_contents.h"
dalecurtis6c58ed02016-10-28 23:02:3730#include "content/public/browser/web_contents_delegate.h"
Gabriel Charettec7108742019-08-23 03:31:4031#include "content/public/test/browser_task_environment.h"
clamy511cf022017-08-23 14:11:0632#include "content/public/test/navigation_simulator.h"
feltfb118572015-08-18 05:22:0133#include "content/public/test/web_contents_tester.h"
Helen Lifa36ad62018-06-01 19:52:5934#include "net/url_request/url_request_test_util.h"
feltbc2eda2d2015-06-23 02:06:0335#include "testing/gtest/include/gtest/gtest.h"
36#include "url/gurl.h"
37
clamy4edbf0e2015-12-02 13:35:4138using content::BrowserThread;
39
feltfb118572015-08-18 05:22:0140static const char* kGoodURL = "https://www.good.com";
41static const char* kBadURL = "https://www.malware.com";
42static const char* kBadURLWithPath = "https://www.malware.com/index.html";
mattmbfc4060d2015-12-18 23:11:3843static const char* kAnotherBadURL = "https://www.badware.com";
44static const char* kLandingURL = "https://www.landing.com";
feltfb118572015-08-18 05:22:0145
vakh9a474d832015-11-13 01:43:0946namespace safe_browsing {
47
clamy4edbf0e2015-12-02 13:35:4148class SafeBrowsingCallbackWaiter {
49 public:
50 SafeBrowsingCallbackWaiter() {}
51
52 bool callback_called() const { return callback_called_; }
53 bool proceed() const { return proceed_; }
54
Carlos IL5edbd0d2020-01-28 01:27:4655 void OnBlockingPageDone(bool proceed, bool showed_interstitial) {
clamy4edbf0e2015-12-02 13:35:4156 DCHECK_CURRENTLY_ON(BrowserThread::UI);
57 callback_called_ = true;
58 proceed_ = proceed;
59 loop_.Quit();
60 }
61
Carlos IL5edbd0d2020-01-28 01:27:4662 void OnBlockingPageDoneOnIO(bool proceed, bool showed_interstitial) {
clamy4edbf0e2015-12-02 13:35:4163 DCHECK_CURRENTLY_ON(BrowserThread::IO);
Sami Kyostilaad439ec2019-08-06 14:49:5264 base::PostTask(
Eric Seckler8652dcd52018-09-20 10:42:2865 FROM_HERE, {BrowserThread::UI},
tzikb5f84b82017-04-20 00:55:2866 base::BindOnce(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
Carlos IL5edbd0d2020-01-28 01:27:4667 base::Unretained(this), proceed, showed_interstitial));
clamy4edbf0e2015-12-02 13:35:4168 }
69
70 void WaitForCallback() {
71 DCHECK_CURRENTLY_ON(BrowserThread::UI);
72 loop_.Run();
73 }
74
75 private:
76 bool callback_called_ = false;
77 bool proceed_ = false;
78 base::RunLoop loop_;
79};
80
feltfb118572015-08-18 05:22:0181class SafeBrowsingUIManagerTest : public ChromeRenderViewHostTestHarness {
feltbc2eda2d2015-06-23 02:06:0382 public:
Gabriel Charettecc8362b2017-09-20 21:59:4083 SafeBrowsingUIManagerTest()
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3284 : scoped_testing_local_state_(TestingBrowserProcess::GetGlobal()) {
kylecharb59c3d72019-10-29 05:26:2685 ui_manager_ = new SafeBrowsingUIManager(nullptr);
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3286 }
feltfb118572015-08-18 05:22:0187
juncai1ee189bd2017-06-09 04:25:4388 ~SafeBrowsingUIManagerTest() override {}
feltbc2eda2d2015-06-23 02:06:0389
clamy4edbf0e2015-12-02 13:35:4190 void SetUp() override {
clamy4edbf0e2015-12-02 13:35:4191 ChromeRenderViewHostTestHarness::SetUp();
estark1ca09ca2016-11-01 04:04:1292 SafeBrowsingUIManager::CreateWhitelistForTesting(web_contents());
Luke Zielinski12ef88552017-06-23 15:36:2793
94 safe_browsing::TestSafeBrowsingServiceFactory sb_service_factory;
95 auto* safe_browsing_service =
96 sb_service_factory.CreateSafeBrowsingService();
97 TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(
98 safe_browsing_service);
99 g_browser_process->safe_browsing_service()->Initialize();
100 // A profile was created already but SafeBrowsingService wasn't around to
101 // get notified of it, so include that notification now.
Evan Stade44fb6e382019-10-05 00:43:43102 safe_browsing_service->OnProfileAdded(
103 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
Ian Vollick381389a62019-06-26 16:49:40104 content::BrowserThread::RunAllPendingTasksOnThreadForTesting(
105 content::BrowserThread::IO);
clamy4edbf0e2015-12-02 13:35:41106 }
feltfb118572015-08-18 05:22:01107
Luke Zielinski12ef88552017-06-23 15:36:27108 void TearDown() override {
109 TestingBrowserProcess::GetGlobal()->safe_browsing_service()->ShutDown();
110 TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(nullptr);
John Abd-El-Malek1b3f5ca2019-06-06 16:42:32111
112 // Depends on LocalState from ChromeRenderViewHostTestHarness.
113 if (SystemNetworkContextManager::GetInstance())
114 SystemNetworkContextManager::DeleteInstance();
115
Luke Zielinski12ef88552017-06-23 15:36:27116 ChromeRenderViewHostTestHarness::TearDown();
117 }
feltfb118572015-08-18 05:22:01118
jialiul792a6662016-12-03 01:44:10119 bool IsWhitelisted(security_interstitials::UnsafeResource resource) {
feltbc2eda2d2015-06-23 02:06:03120 return ui_manager_->IsWhitelisted(resource);
121 }
122
jialiul792a6662016-12-03 01:44:10123 void AddToWhitelist(security_interstitials::UnsafeResource resource) {
estark1ca09ca2016-11-01 04:04:12124 ui_manager_->AddToWhitelistUrlSet(
125 SafeBrowsingUIManager::GetMainFrameWhitelistUrlForResourceForTesting(
126 resource),
estark7ffa8c62016-11-11 23:21:55127 web_contents(), false, resource.threat_type);
feltfb118572015-08-18 05:22:01128 }
129
jialiul792a6662016-12-03 01:44:10130 security_interstitials::UnsafeResource MakeUnsafeResource(
mattmbfc4060d2015-12-18 23:11:38131 const char* url,
132 bool is_subresource) {
jialiul792a6662016-12-03 01:44:10133 security_interstitials::UnsafeResource resource;
feltfb118572015-08-18 05:22:01134 resource.url = GURL(url);
mattmbfc4060d2015-12-18 23:11:38135 resource.is_subresource = is_subresource;
Ali Jumaee602932020-01-24 16:39:18136 resource.web_contents_getter = security_interstitials::GetWebContentsGetter(
137 web_contents()->GetMainFrame()->GetProcess()->GetID(),
138 web_contents()->GetMainFrame()->GetRoutingID());
feltfb118572015-08-18 05:22:01139 resource.threat_type = SB_THREAT_TYPE_URL_MALWARE;
140 return resource;
141 }
142
jialiul792a6662016-12-03 01:44:10143 security_interstitials::UnsafeResource MakeUnsafeResourceAndStartNavigation(
feltfb118572015-08-18 05:22:01144 const char* url) {
jialiul792a6662016-12-03 01:44:10145 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38146 MakeUnsafeResource(url, false /* is_subresource */);
feltfb118572015-08-18 05:22:01147
mattmbfc4060d2015-12-18 23:11:38148 // The WC doesn't have a URL without a navigation. A main-frame malware
149 // unsafe resource must be a pending navigation.
clamy511cf022017-08-23 14:11:06150 auto navigation = content::NavigationSimulator::CreateBrowserInitiated(
151 GURL(url), web_contents());
152 navigation->Start();
feltfb118572015-08-18 05:22:01153 return resource;
feltbc2eda2d2015-06-23 02:06:03154 }
155
clamy4edbf0e2015-12-02 13:35:41156 void SimulateBlockingPageDone(
jialiul792a6662016-12-03 01:44:10157 const std::vector<security_interstitials::UnsafeResource>& resources,
clamy4edbf0e2015-12-02 13:35:41158 bool proceed) {
estark1ca09ca2016-11-01 04:04:12159 GURL main_frame_url;
160 content::NavigationEntry* entry =
161 web_contents()->GetController().GetVisibleEntry();
162 if (entry)
163 main_frame_url = entry->GetURL();
164
165 ui_manager_->OnBlockingPageDone(resources, proceed, web_contents(),
Carlos IL5edbd0d2020-01-28 01:27:46166 main_frame_url,
167 true /* showed_interstitial */);
clamy4edbf0e2015-12-02 13:35:41168 }
169
dalecurtis6c58ed02016-10-28 23:02:37170 protected:
171 SafeBrowsingUIManager* ui_manager() { return ui_manager_.get(); }
172
feltbc2eda2d2015-06-23 02:06:03173 private:
174 scoped_refptr<SafeBrowsingUIManager> ui_manager_;
John Abd-El-Malek1b3f5ca2019-06-06 16:42:32175 ScopedTestingLocalState scoped_testing_local_state_;
feltbc2eda2d2015-06-23 02:06:03176};
177
Marc Treib3d26e922017-08-14 16:58:26178// Leaks memory. https://crbug.com/755118
179#if defined(LEAK_SANITIZER)
180#define MAYBE_Whitelist DISABLED_Whitelist
181#else
182#define MAYBE_Whitelist Whitelist
183#endif
184TEST_F(SafeBrowsingUIManagerTest, MAYBE_Whitelist) {
jialiul792a6662016-12-03 01:44:10185 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38186 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltbc2eda2d2015-06-23 02:06:03187 AddToWhitelist(resource);
188 EXPECT_TRUE(IsWhitelisted(resource));
189}
190
Marc Treib3d26e922017-08-14 16:58:26191// Leaks memory. https://crbug.com/755118
192#if defined(LEAK_SANITIZER)
193#define MAYBE_WhitelistIgnoresSitesNotAdded \
194 DISABLED_WhitelistIgnoresSitesNotAdded
195#else
196#define MAYBE_WhitelistIgnoresSitesNotAdded WhitelistIgnoresSitesNotAdded
197#endif
198TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresSitesNotAdded) {
jialiul792a6662016-12-03 01:44:10199 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38200 MakeUnsafeResourceAndStartNavigation(kGoodURL);
feltbc2eda2d2015-06-23 02:06:03201 EXPECT_FALSE(IsWhitelisted(resource));
feltfb118572015-08-18 05:22:01202}
203
Marc Treib3d26e922017-08-14 16:58:26204// Leaks memory. https://crbug.com/755118
205#if defined(LEAK_SANITIZER)
206#define MAYBE_WhitelistRemembersThreatType DISABLED_WhitelistRemembersThreatType
207#else
208#define MAYBE_WhitelistRemembersThreatType WhitelistRemembersThreatType
209#endif
210TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistRemembersThreatType) {
jialiul792a6662016-12-03 01:44:10211 security_interstitials::UnsafeResource resource =
estark7ffa8c62016-11-11 23:21:55212 MakeUnsafeResourceAndStartNavigation(kBadURL);
213 AddToWhitelist(resource);
214 EXPECT_TRUE(IsWhitelisted(resource));
215 SBThreatType threat_type;
216 content::NavigationEntry* entry =
217 web_contents()->GetController().GetVisibleEntry();
218 ASSERT_TRUE(entry);
219 EXPECT_TRUE(ui_manager()->IsUrlWhitelistedOrPendingForWebContents(
220 resource.url, resource.is_subresource, entry,
221 resource.web_contents_getter.Run(), true, &threat_type));
222 EXPECT_EQ(resource.threat_type, threat_type);
223}
224
Marc Treib3d26e922017-08-14 16:58:26225// Leaks memory. https://crbug.com/755118
226#if defined(LEAK_SANITIZER)
227#define MAYBE_WhitelistIgnoresPath DISABLED_WhitelistIgnoresPath
228#else
229#define MAYBE_WhitelistIgnoresPath WhitelistIgnoresPath
230#endif
231TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresPath) {
jialiul792a6662016-12-03 01:44:10232 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38233 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltbc2eda2d2015-06-23 02:06:03234 AddToWhitelist(resource);
235 EXPECT_TRUE(IsWhitelisted(resource));
feltfb118572015-08-18 05:22:01236
mattmbfc4060d2015-12-18 23:11:38237 content::WebContentsTester::For(web_contents())->CommitPendingNavigation();
238
jialiul792a6662016-12-03 01:44:10239 security_interstitials::UnsafeResource resource_path =
mattmbfc4060d2015-12-18 23:11:38240 MakeUnsafeResourceAndStartNavigation(kBadURLWithPath);
feltfb118572015-08-18 05:22:01241 EXPECT_TRUE(IsWhitelisted(resource_path));
feltbc2eda2d2015-06-23 02:06:03242}
243
Marc Treib3d26e922017-08-14 16:58:26244// Leaks memory. https://crbug.com/755118
245#if defined(LEAK_SANITIZER)
246#define MAYBE_WhitelistIgnoresThreatType DISABLED_WhitelistIgnoresThreatType
247#else
248#define MAYBE_WhitelistIgnoresThreatType WhitelistIgnoresThreatType
249#endif
250TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresThreatType) {
jialiul792a6662016-12-03 01:44:10251 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38252 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltfb118572015-08-18 05:22:01253 AddToWhitelist(resource);
254 EXPECT_TRUE(IsWhitelisted(resource));
feltbc2eda2d2015-06-23 02:06:03255
jialiul792a6662016-12-03 01:44:10256 security_interstitials::UnsafeResource resource_phishing =
mattmbfc4060d2015-12-18 23:11:38257 MakeUnsafeResource(kBadURL, false /* is_subresource */);
feltfb118572015-08-18 05:22:01258 resource_phishing.threat_type = SB_THREAT_TYPE_URL_PHISHING;
259 EXPECT_TRUE(IsWhitelisted(resource_phishing));
feltbc2eda2d2015-06-23 02:06:03260}
261
Marc Treib3d26e922017-08-14 16:58:26262// Leaks memory. https://crbug.com/755118
263#if defined(LEAK_SANITIZER)
264#define MAYBE_WhitelistWithUnrelatedPendingLoad \
265 DISABLED_WhitelistWithUnrelatedPendingLoad
266#else
267#define MAYBE_WhitelistWithUnrelatedPendingLoad \
268 WhitelistWithUnrelatedPendingLoad
269#endif
270TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistWithUnrelatedPendingLoad) {
mattmbfc4060d2015-12-18 23:11:38271 // Commit load of landing page.
272 NavigateAndCommit(GURL(kLandingURL));
clamy511cf022017-08-23 14:11:06273 auto unrelated_navigation =
274 content::NavigationSimulator::CreateBrowserInitiated(GURL(kGoodURL),
275 web_contents());
mattmbfc4060d2015-12-18 23:11:38276 {
277 // Simulate subresource malware hit on the landing page.
jialiul792a6662016-12-03 01:44:10278 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38279 MakeUnsafeResource(kBadURL, true /* is_subresource */);
280
281 // Start pending load to unrelated site.
clamy511cf022017-08-23 14:11:06282 unrelated_navigation->Start();
mattmbfc4060d2015-12-18 23:11:38283
284 // Whitelist the resource on the landing page.
285 AddToWhitelist(resource);
286 EXPECT_TRUE(IsWhitelisted(resource));
287 }
288
289 // Commit the pending load of unrelated site.
clamy511cf022017-08-23 14:11:06290 unrelated_navigation->Commit();
mattmbfc4060d2015-12-18 23:11:38291 {
292 // The unrelated site is not on the whitelist, even if the same subresource
293 // was on it.
jialiul792a6662016-12-03 01:44:10294 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38295 MakeUnsafeResource(kBadURL, true /* is_subresource */);
296 EXPECT_FALSE(IsWhitelisted(resource));
297 }
298
299 // Navigate back to the original landing url.
300 NavigateAndCommit(GURL(kLandingURL));
301 {
jialiul792a6662016-12-03 01:44:10302 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38303 MakeUnsafeResource(kBadURL, true /* is_subresource */);
304 // Original resource url is whitelisted.
305 EXPECT_TRUE(IsWhitelisted(resource));
306 }
307 {
308 // A different malware subresource on the same page is also whitelisted.
309 // (The whitelist is by the page url, not the resource url.)
jialiul792a6662016-12-03 01:44:10310 security_interstitials::UnsafeResource resource2 =
mattmbfc4060d2015-12-18 23:11:38311 MakeUnsafeResource(kAnotherBadURL, true /* is_subresource */);
312 EXPECT_TRUE(IsWhitelisted(resource2));
313 }
314}
315
Evgenii Stepanov199c0132017-08-18 21:19:41316// Leaks memory. https://crbug.com/755118
317#if defined(LEAK_SANITIZER)
318#define MAYBE_UICallbackProceed DISABLED_UICallbackProceed
319#else
320#define MAYBE_UICallbackProceed UICallbackProceed
321#endif
322TEST_F(SafeBrowsingUIManagerTest, MAYBE_UICallbackProceed) {
jialiul792a6662016-12-03 01:44:10323 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38324 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41325 SafeBrowsingCallbackWaiter waiter;
326 resource.callback =
327 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
328 base::Unretained(&waiter));
329 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52330 base::CreateSingleThreadTaskRunner({BrowserThread::UI});
jialiul792a6662016-12-03 01:44:10331 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41332 resources.push_back(resource);
333 SimulateBlockingPageDone(resources, true);
334 EXPECT_TRUE(IsWhitelisted(resource));
335 waiter.WaitForCallback();
336 EXPECT_TRUE(waiter.callback_called());
337 EXPECT_TRUE(waiter.proceed());
338}
339
Evgenii Stepanov199c0132017-08-18 21:19:41340// Leaks memory. https://crbug.com/755118
341#if defined(LEAK_SANITIZER)
342#define MAYBE_UICallbackDontProceed DISABLED_UICallbackDontProceed
343#else
344#define MAYBE_UICallbackDontProceed UICallbackDontProceed
345#endif
346TEST_F(SafeBrowsingUIManagerTest, MAYBE_UICallbackDontProceed) {
jialiul792a6662016-12-03 01:44:10347 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38348 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41349 SafeBrowsingCallbackWaiter waiter;
350 resource.callback =
351 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
352 base::Unretained(&waiter));
353 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52354 base::CreateSingleThreadTaskRunner({BrowserThread::UI});
jialiul792a6662016-12-03 01:44:10355 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41356 resources.push_back(resource);
357 SimulateBlockingPageDone(resources, false);
358 EXPECT_FALSE(IsWhitelisted(resource));
359 waiter.WaitForCallback();
360 EXPECT_TRUE(waiter.callback_called());
361 EXPECT_FALSE(waiter.proceed());
362}
363
Evgenii Stepanov199c0132017-08-18 21:19:41364// Leaks memory. https://crbug.com/755118
365#if defined(LEAK_SANITIZER)
366#define MAYBE_IOCallbackProceed DISABLED_IOCallbackProceed
367#else
368#define MAYBE_IOCallbackProceed IOCallbackProceed
369#endif
370TEST_F(SafeBrowsingUIManagerTest, MAYBE_IOCallbackProceed) {
jialiul792a6662016-12-03 01:44:10371 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38372 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41373 SafeBrowsingCallbackWaiter waiter;
374 resource.callback =
375 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
376 base::Unretained(&waiter));
377 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52378 base::CreateSingleThreadTaskRunner({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10379 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41380 resources.push_back(resource);
381 SimulateBlockingPageDone(resources, true);
382 EXPECT_TRUE(IsWhitelisted(resource));
383 waiter.WaitForCallback();
384 EXPECT_TRUE(waiter.callback_called());
385 EXPECT_TRUE(waiter.proceed());
386}
387
Evgenii Stepanov199c0132017-08-18 21:19:41388// Leaks memory. https://crbug.com/755118
389#if defined(LEAK_SANITIZER)
390#define MAYBE_IOCallbackDontProceed DISABLED_IOCallbackDontProceed
391#else
392#define MAYBE_IOCallbackDontProceed IOCallbackDontProceed
393#endif
394TEST_F(SafeBrowsingUIManagerTest, MAYBE_IOCallbackDontProceed) {
jialiul792a6662016-12-03 01:44:10395 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38396 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41397 SafeBrowsingCallbackWaiter waiter;
398 resource.callback =
399 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
400 base::Unretained(&waiter));
401 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52402 base::CreateSingleThreadTaskRunner({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10403 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41404 resources.push_back(resource);
405 SimulateBlockingPageDone(resources, false);
406 EXPECT_FALSE(IsWhitelisted(resource));
407 waiter.WaitForCallback();
408 EXPECT_TRUE(waiter.callback_called());
409 EXPECT_FALSE(waiter.proceed());
410}
411
dalecurtis6c58ed02016-10-28 23:02:37412namespace {
413
414// A WebContentsDelegate that records whether
415// VisibleSecurityStateChanged() was called.
416class SecurityStateWebContentsDelegate : public content::WebContentsDelegate {
417 public:
418 SecurityStateWebContentsDelegate() {}
419 ~SecurityStateWebContentsDelegate() override {}
420
421 bool visible_security_state_changed() const {
422 return visible_security_state_changed_;
423 }
424
425 void ClearVisibleSecurityStateChanged() {
426 visible_security_state_changed_ = false;
427 }
428
429 // WebContentsDelegate:
430 void VisibleSecurityStateChanged(content::WebContents* source) override {
431 visible_security_state_changed_ = true;
432 }
433
434 private:
435 bool visible_security_state_changed_ = false;
436 DISALLOW_COPY_AND_ASSIGN(SecurityStateWebContentsDelegate);
437};
438
439// A test blocking page that does not create windows.
440class TestSafeBrowsingBlockingPage : public SafeBrowsingBlockingPage {
441 public:
jialiul3d6032e2017-01-12 00:41:31442 TestSafeBrowsingBlockingPage(BaseUIManager* manager,
dalecurtis6c58ed02016-10-28 23:02:37443 content::WebContents* web_contents,
444 const GURL& main_frame_url,
445 const UnsafeResourceList& unsafe_resources)
jialiul3d6032e2017-01-12 00:41:31446 : SafeBrowsingBlockingPage(
447 manager,
448 web_contents,
449 main_frame_url,
450 unsafe_resources,
edwardjungd7395fb02017-05-12 23:13:29451 BaseSafeBrowsingErrorUI::SBErrorDisplayOptions(
ntfschra5448fa2017-02-02 01:01:31452 BaseBlockingPage::IsMainPageLoadBlocked(unsafe_resources),
Carlos IL43dfc262019-11-27 19:40:31453 false, // is_extended_reporting_opt_in_allowed
454 false, // is_off_the_record
455 false, // is_extended_reporting_enabled
456 false, // is_extended_reporting_policy_managed
Bettina460d9952020-03-23 19:44:01457 false, // is_enhanced_protection_enabled
Carlos IL43dfc262019-11-27 19:40:31458 false, // is_proceed_anyway_disabled
459 true, // should_open_links_in_new_tab
460 true, // always_show_back_to_safety
461 "cpn_safe_browsing"), // help_center_article_link
462 true) { // should_trigger_reporting
dalecurtis6c58ed02016-10-28 23:02:37463 // Don't delay details at all for the unittest.
ntfschrfef42f92017-02-24 02:15:47464 SetThreatDetailsProceedDelayForTesting(0);
dalecurtis6c58ed02016-10-28 23:02:37465 DontCreateViewForTesting();
466 }
467};
468
469// A factory that creates TestSafeBrowsingBlockingPages.
470class TestSafeBrowsingBlockingPageFactory
471 : public SafeBrowsingBlockingPageFactory {
472 public:
473 TestSafeBrowsingBlockingPageFactory() {}
474 ~TestSafeBrowsingBlockingPageFactory() override {}
475
476 SafeBrowsingBlockingPage* CreateSafeBrowsingPage(
jialiul3d6032e2017-01-12 00:41:31477 BaseUIManager* delegate,
dalecurtis6c58ed02016-10-28 23:02:37478 content::WebContents* web_contents,
479 const GURL& main_frame_url,
Carlos IL43dfc262019-11-27 19:40:31480 const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
481 bool should_trigger_reporting) override {
dalecurtis6c58ed02016-10-28 23:02:37482 return new TestSafeBrowsingBlockingPage(delegate, web_contents,
483 main_frame_url, unsafe_resources);
484 }
485};
486
487} // namespace
488
489// Tests that the WebContentsDelegate is notified of a visible security
490// state change when a blocking page is shown for a subresource.
Evgenii Stepanov199c0132017-08-18 21:19:41491// Leaks memory. https://crbug.com/755118
492#if defined(LEAK_SANITIZER)
493#define MAYBE_VisibleSecurityStateChangedForUnsafeSubresource \
494 DISABLED_VisibleSecurityStateChangedForUnsafeSubresource
495#else
496#define MAYBE_VisibleSecurityStateChangedForUnsafeSubresource \
497 VisibleSecurityStateChangedForUnsafeSubresource
498#endif
dalecurtis6c58ed02016-10-28 23:02:37499TEST_F(SafeBrowsingUIManagerTest,
Evgenii Stepanov199c0132017-08-18 21:19:41500 MAYBE_VisibleSecurityStateChangedForUnsafeSubresource) {
dalecurtis6c58ed02016-10-28 23:02:37501 TestSafeBrowsingBlockingPageFactory factory;
502 SafeBrowsingBlockingPage::RegisterFactory(&factory);
503 SecurityStateWebContentsDelegate delegate;
504 web_contents()->SetDelegate(&delegate);
505
506 // Simulate a blocking page showing for an unsafe subresource.
jialiul792a6662016-12-03 01:44:10507 security_interstitials::UnsafeResource resource =
dalecurtis6c58ed02016-10-28 23:02:37508 MakeUnsafeResource(kBadURL, true /* is_subresource */);
509 // Needed for showing the blocking page.
510 resource.threat_source = safe_browsing::ThreatSource::REMOTE;
Carlos ILe7464b9c2020-01-18 01:38:30511
dalecurtis6c58ed02016-10-28 23:02:37512 NavigateAndCommit(GURL("http://example.test"));
513
514 delegate.ClearVisibleSecurityStateChanged();
515 EXPECT_FALSE(delegate.visible_security_state_changed());
516 ui_manager()->DisplayBlockingPage(resource);
517 EXPECT_TRUE(delegate.visible_security_state_changed());
518
519 // Simulate proceeding through the blocking page.
520 SafeBrowsingCallbackWaiter waiter;
521 resource.callback =
522 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
523 base::Unretained(&waiter));
524 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52525 base::CreateSingleThreadTaskRunner({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10526 std::vector<security_interstitials::UnsafeResource> resources;
dalecurtis6c58ed02016-10-28 23:02:37527 resources.push_back(resource);
528
529 delegate.ClearVisibleSecurityStateChanged();
530 EXPECT_FALSE(delegate.visible_security_state_changed());
531 SimulateBlockingPageDone(resources, true);
532 EXPECT_TRUE(delegate.visible_security_state_changed());
533
534 waiter.WaitForCallback();
535 EXPECT_TRUE(waiter.callback_called());
536 EXPECT_TRUE(waiter.proceed());
537 EXPECT_TRUE(IsWhitelisted(resource));
538}
539
Daniel Ruberya5af634d2020-03-03 23:24:40540TEST_F(SafeBrowsingUIManagerTest, ShowBlockPageNoCallback) {
541 TestSafeBrowsingBlockingPageFactory factory;
542 SafeBrowsingBlockingPage::RegisterFactory(&factory);
543 SecurityStateWebContentsDelegate delegate;
544 web_contents()->SetDelegate(&delegate);
545
546 // Simulate a blocking page showing for an unsafe subresource.
547 security_interstitials::UnsafeResource resource =
548 MakeUnsafeResource(kBadURL, false /* is_subresource */);
549 // Needed for showing the blocking page.
550 resource.threat_source = safe_browsing::ThreatSource::REMOTE;
551
552 // This call caused a crash in https://crbug.com/1058094. Just verify that we
553 // don't crash anymore.
554 ui_manager()->DisplayBlockingPage(resource);
555}
556
vakh9a474d832015-11-13 01:43:09557} // namespace safe_browsing