blob: e37dac8adc28950bfb25b2cf6a021ffd13b1a757 [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"
clamy4edbf0e2015-12-02 13:35:418#include "base/run_loop.h"
Eric Seckler8652dcd52018-09-20 10:42:289#include "base/task/post_task.h"
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3210#include "chrome/browser/net/system_network_context_manager.h"
dalecurtis6c58ed02016-10-28 23:02:3711#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
Luke Zielinski12ef88552017-06-23 15:36:2712#include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
Findit86f6ae0fa2017-09-28 02:19:0113#include "chrome/browser/safe_browsing/ui_manager.h"
feltfb118572015-08-18 05:22:0114#include "chrome/test/base/chrome_render_view_host_test_harness.h"
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3215#include "chrome/test/base/scoped_testing_local_state.h"
Luke Zielinski12ef88552017-06-23 15:36:2716#include "chrome/test/base/testing_browser_process.h"
feltfb118572015-08-18 05:22:0117#include "chrome/test/base/testing_profile.h"
timvolodine89cf11712017-05-15 18:05:0718#include "components/safe_browsing/common/safe_browsing_prefs.h"
Tim Volodinee45938472017-09-21 10:08:2219#include "components/safe_browsing/db/util.h"
edwardjungd7395fb02017-05-12 23:13:2920#include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
Eric Seckler8652dcd52018-09-20 10:42:2821#include "content/public/browser/browser_task_traits.h"
estark1ca09ca2016-11-01 04:04:1222#include "content/public/browser/navigation_entry.h"
Lukasz Anforowiczb55fc492017-10-02 18:38:3423#include "content/public/browser/render_frame_host.h"
feltfb118572015-08-18 05:22:0124#include "content/public/browser/render_process_host.h"
25#include "content/public/browser/render_view_host.h"
26#include "content/public/browser/web_contents.h"
dalecurtis6c58ed02016-10-28 23:02:3727#include "content/public/browser/web_contents_delegate.h"
Gabriel Charettec7108742019-08-23 03:31:4028#include "content/public/test/browser_task_environment.h"
clamy511cf022017-08-23 14:11:0629#include "content/public/test/navigation_simulator.h"
feltfb118572015-08-18 05:22:0130#include "content/public/test/web_contents_tester.h"
Helen Lifa36ad62018-06-01 19:52:5931#include "net/url_request/url_request_test_util.h"
feltbc2eda2d2015-06-23 02:06:0332#include "testing/gtest/include/gtest/gtest.h"
33#include "url/gurl.h"
34
clamy4edbf0e2015-12-02 13:35:4135using content::BrowserThread;
36
feltfb118572015-08-18 05:22:0137static const char* kGoodURL = "https://www.good.com";
38static const char* kBadURL = "https://www.malware.com";
39static const char* kBadURLWithPath = "https://www.malware.com/index.html";
mattmbfc4060d2015-12-18 23:11:3840static const char* kAnotherBadURL = "https://www.badware.com";
41static const char* kLandingURL = "https://www.landing.com";
feltfb118572015-08-18 05:22:0142
vakh9a474d832015-11-13 01:43:0943namespace safe_browsing {
44
clamy4edbf0e2015-12-02 13:35:4145class SafeBrowsingCallbackWaiter {
46 public:
47 SafeBrowsingCallbackWaiter() {}
48
49 bool callback_called() const { return callback_called_; }
50 bool proceed() const { return proceed_; }
51
52 void OnBlockingPageDone(bool proceed) {
53 DCHECK_CURRENTLY_ON(BrowserThread::UI);
54 callback_called_ = true;
55 proceed_ = proceed;
56 loop_.Quit();
57 }
58
59 void OnBlockingPageDoneOnIO(bool proceed) {
60 DCHECK_CURRENTLY_ON(BrowserThread::IO);
Sami Kyostilaad439ec2019-08-06 14:49:5261 base::PostTask(
Eric Seckler8652dcd52018-09-20 10:42:2862 FROM_HERE, {BrowserThread::UI},
tzikb5f84b82017-04-20 00:55:2863 base::BindOnce(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
64 base::Unretained(this), proceed));
clamy4edbf0e2015-12-02 13:35:4165 }
66
67 void WaitForCallback() {
68 DCHECK_CURRENTLY_ON(BrowserThread::UI);
69 loop_.Run();
70 }
71
72 private:
73 bool callback_called_ = false;
74 bool proceed_ = false;
75 base::RunLoop loop_;
76};
77
feltfb118572015-08-18 05:22:0178class SafeBrowsingUIManagerTest : public ChromeRenderViewHostTestHarness {
feltbc2eda2d2015-06-23 02:06:0379 public:
Gabriel Charettecc8362b2017-09-20 21:59:4080 SafeBrowsingUIManagerTest()
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3281 : scoped_testing_local_state_(TestingBrowserProcess::GetGlobal()) {
kylecharb59c3d72019-10-29 05:26:2682 ui_manager_ = new SafeBrowsingUIManager(nullptr);
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3283 }
feltfb118572015-08-18 05:22:0184
juncai1ee189bd2017-06-09 04:25:4385 ~SafeBrowsingUIManagerTest() override {}
feltbc2eda2d2015-06-23 02:06:0386
clamy4edbf0e2015-12-02 13:35:4187 void SetUp() override {
clamy4edbf0e2015-12-02 13:35:4188 ChromeRenderViewHostTestHarness::SetUp();
estark1ca09ca2016-11-01 04:04:1289 SafeBrowsingUIManager::CreateWhitelistForTesting(web_contents());
Luke Zielinski12ef88552017-06-23 15:36:2790
91 safe_browsing::TestSafeBrowsingServiceFactory sb_service_factory;
92 auto* safe_browsing_service =
93 sb_service_factory.CreateSafeBrowsingService();
94 TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(
95 safe_browsing_service);
96 g_browser_process->safe_browsing_service()->Initialize();
97 // A profile was created already but SafeBrowsingService wasn't around to
98 // get notified of it, so include that notification now.
Evan Stade44fb6e382019-10-05 00:43:4399 safe_browsing_service->OnProfileAdded(
100 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
Ian Vollick381389a62019-06-26 16:49:40101 content::BrowserThread::RunAllPendingTasksOnThreadForTesting(
102 content::BrowserThread::IO);
clamy4edbf0e2015-12-02 13:35:41103 }
feltfb118572015-08-18 05:22:01104
Luke Zielinski12ef88552017-06-23 15:36:27105 void TearDown() override {
106 TestingBrowserProcess::GetGlobal()->safe_browsing_service()->ShutDown();
107 TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(nullptr);
John Abd-El-Malek1b3f5ca2019-06-06 16:42:32108
109 // Depends on LocalState from ChromeRenderViewHostTestHarness.
110 if (SystemNetworkContextManager::GetInstance())
111 SystemNetworkContextManager::DeleteInstance();
112
Luke Zielinski12ef88552017-06-23 15:36:27113 ChromeRenderViewHostTestHarness::TearDown();
114 }
feltfb118572015-08-18 05:22:01115
jialiul792a6662016-12-03 01:44:10116 bool IsWhitelisted(security_interstitials::UnsafeResource resource) {
feltbc2eda2d2015-06-23 02:06:03117 return ui_manager_->IsWhitelisted(resource);
118 }
119
jialiul792a6662016-12-03 01:44:10120 void AddToWhitelist(security_interstitials::UnsafeResource resource) {
estark1ca09ca2016-11-01 04:04:12121 ui_manager_->AddToWhitelistUrlSet(
122 SafeBrowsingUIManager::GetMainFrameWhitelistUrlForResourceForTesting(
123 resource),
estark7ffa8c62016-11-11 23:21:55124 web_contents(), false, resource.threat_type);
feltfb118572015-08-18 05:22:01125 }
126
jialiul792a6662016-12-03 01:44:10127 security_interstitials::UnsafeResource MakeUnsafeResource(
mattmbfc4060d2015-12-18 23:11:38128 const char* url,
129 bool is_subresource) {
jialiul792a6662016-12-03 01:44:10130 security_interstitials::UnsafeResource resource;
feltfb118572015-08-18 05:22:01131 resource.url = GURL(url);
mattmbfc4060d2015-12-18 23:11:38132 resource.is_subresource = is_subresource;
scottmg22e4f25a2016-08-15 21:09:03133 resource.web_contents_getter =
jialiul792a6662016-12-03 01:44:10134 security_interstitials::UnsafeResource::GetWebContentsGetter(
Lukasz Anforowiczb55fc492017-10-02 18:38:34135 web_contents()->GetMainFrame()->GetProcess()->GetID(),
scottmg22e4f25a2016-08-15 21:09:03136 web_contents()->GetMainFrame()->GetRoutingID());
feltfb118572015-08-18 05:22:01137 resource.threat_type = SB_THREAT_TYPE_URL_MALWARE;
138 return resource;
139 }
140
jialiul792a6662016-12-03 01:44:10141 security_interstitials::UnsafeResource MakeUnsafeResourceAndStartNavigation(
feltfb118572015-08-18 05:22:01142 const char* url) {
jialiul792a6662016-12-03 01:44:10143 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38144 MakeUnsafeResource(url, false /* is_subresource */);
feltfb118572015-08-18 05:22:01145
mattmbfc4060d2015-12-18 23:11:38146 // The WC doesn't have a URL without a navigation. A main-frame malware
147 // unsafe resource must be a pending navigation.
clamy511cf022017-08-23 14:11:06148 auto navigation = content::NavigationSimulator::CreateBrowserInitiated(
149 GURL(url), web_contents());
150 navigation->Start();
feltfb118572015-08-18 05:22:01151 return resource;
feltbc2eda2d2015-06-23 02:06:03152 }
153
clamy4edbf0e2015-12-02 13:35:41154 void SimulateBlockingPageDone(
jialiul792a6662016-12-03 01:44:10155 const std::vector<security_interstitials::UnsafeResource>& resources,
clamy4edbf0e2015-12-02 13:35:41156 bool proceed) {
estark1ca09ca2016-11-01 04:04:12157 GURL main_frame_url;
158 content::NavigationEntry* entry =
159 web_contents()->GetController().GetVisibleEntry();
160 if (entry)
161 main_frame_url = entry->GetURL();
162
163 ui_manager_->OnBlockingPageDone(resources, proceed, web_contents(),
164 main_frame_url);
clamy4edbf0e2015-12-02 13:35:41165 }
166
dalecurtis6c58ed02016-10-28 23:02:37167 protected:
168 SafeBrowsingUIManager* ui_manager() { return ui_manager_.get(); }
169
feltbc2eda2d2015-06-23 02:06:03170 private:
171 scoped_refptr<SafeBrowsingUIManager> ui_manager_;
John Abd-El-Malek1b3f5ca2019-06-06 16:42:32172 ScopedTestingLocalState scoped_testing_local_state_;
feltbc2eda2d2015-06-23 02:06:03173};
174
Marc Treib3d26e922017-08-14 16:58:26175// Leaks memory. https://crbug.com/755118
176#if defined(LEAK_SANITIZER)
177#define MAYBE_Whitelist DISABLED_Whitelist
178#else
179#define MAYBE_Whitelist Whitelist
180#endif
181TEST_F(SafeBrowsingUIManagerTest, MAYBE_Whitelist) {
jialiul792a6662016-12-03 01:44:10182 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38183 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltbc2eda2d2015-06-23 02:06:03184 AddToWhitelist(resource);
185 EXPECT_TRUE(IsWhitelisted(resource));
186}
187
Marc Treib3d26e922017-08-14 16:58:26188// Leaks memory. https://crbug.com/755118
189#if defined(LEAK_SANITIZER)
190#define MAYBE_WhitelistIgnoresSitesNotAdded \
191 DISABLED_WhitelistIgnoresSitesNotAdded
192#else
193#define MAYBE_WhitelistIgnoresSitesNotAdded WhitelistIgnoresSitesNotAdded
194#endif
195TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresSitesNotAdded) {
jialiul792a6662016-12-03 01:44:10196 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38197 MakeUnsafeResourceAndStartNavigation(kGoodURL);
feltbc2eda2d2015-06-23 02:06:03198 EXPECT_FALSE(IsWhitelisted(resource));
feltfb118572015-08-18 05:22:01199}
200
Marc Treib3d26e922017-08-14 16:58:26201// Leaks memory. https://crbug.com/755118
202#if defined(LEAK_SANITIZER)
203#define MAYBE_WhitelistRemembersThreatType DISABLED_WhitelistRemembersThreatType
204#else
205#define MAYBE_WhitelistRemembersThreatType WhitelistRemembersThreatType
206#endif
207TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistRemembersThreatType) {
jialiul792a6662016-12-03 01:44:10208 security_interstitials::UnsafeResource resource =
estark7ffa8c62016-11-11 23:21:55209 MakeUnsafeResourceAndStartNavigation(kBadURL);
210 AddToWhitelist(resource);
211 EXPECT_TRUE(IsWhitelisted(resource));
212 SBThreatType threat_type;
213 content::NavigationEntry* entry =
214 web_contents()->GetController().GetVisibleEntry();
215 ASSERT_TRUE(entry);
216 EXPECT_TRUE(ui_manager()->IsUrlWhitelistedOrPendingForWebContents(
217 resource.url, resource.is_subresource, entry,
218 resource.web_contents_getter.Run(), true, &threat_type));
219 EXPECT_EQ(resource.threat_type, threat_type);
220}
221
Marc Treib3d26e922017-08-14 16:58:26222// Leaks memory. https://crbug.com/755118
223#if defined(LEAK_SANITIZER)
224#define MAYBE_WhitelistIgnoresPath DISABLED_WhitelistIgnoresPath
225#else
226#define MAYBE_WhitelistIgnoresPath WhitelistIgnoresPath
227#endif
228TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresPath) {
jialiul792a6662016-12-03 01:44:10229 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38230 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltbc2eda2d2015-06-23 02:06:03231 AddToWhitelist(resource);
232 EXPECT_TRUE(IsWhitelisted(resource));
feltfb118572015-08-18 05:22:01233
mattmbfc4060d2015-12-18 23:11:38234 content::WebContentsTester::For(web_contents())->CommitPendingNavigation();
235
jialiul792a6662016-12-03 01:44:10236 security_interstitials::UnsafeResource resource_path =
mattmbfc4060d2015-12-18 23:11:38237 MakeUnsafeResourceAndStartNavigation(kBadURLWithPath);
feltfb118572015-08-18 05:22:01238 EXPECT_TRUE(IsWhitelisted(resource_path));
feltbc2eda2d2015-06-23 02:06:03239}
240
Marc Treib3d26e922017-08-14 16:58:26241// Leaks memory. https://crbug.com/755118
242#if defined(LEAK_SANITIZER)
243#define MAYBE_WhitelistIgnoresThreatType DISABLED_WhitelistIgnoresThreatType
244#else
245#define MAYBE_WhitelistIgnoresThreatType WhitelistIgnoresThreatType
246#endif
247TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresThreatType) {
jialiul792a6662016-12-03 01:44:10248 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38249 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltfb118572015-08-18 05:22:01250 AddToWhitelist(resource);
251 EXPECT_TRUE(IsWhitelisted(resource));
feltbc2eda2d2015-06-23 02:06:03252
jialiul792a6662016-12-03 01:44:10253 security_interstitials::UnsafeResource resource_phishing =
mattmbfc4060d2015-12-18 23:11:38254 MakeUnsafeResource(kBadURL, false /* is_subresource */);
feltfb118572015-08-18 05:22:01255 resource_phishing.threat_type = SB_THREAT_TYPE_URL_PHISHING;
256 EXPECT_TRUE(IsWhitelisted(resource_phishing));
feltbc2eda2d2015-06-23 02:06:03257}
258
Marc Treib3d26e922017-08-14 16:58:26259// Leaks memory. https://crbug.com/755118
260#if defined(LEAK_SANITIZER)
261#define MAYBE_WhitelistWithUnrelatedPendingLoad \
262 DISABLED_WhitelistWithUnrelatedPendingLoad
263#else
264#define MAYBE_WhitelistWithUnrelatedPendingLoad \
265 WhitelistWithUnrelatedPendingLoad
266#endif
267TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistWithUnrelatedPendingLoad) {
mattmbfc4060d2015-12-18 23:11:38268 // Commit load of landing page.
269 NavigateAndCommit(GURL(kLandingURL));
clamy511cf022017-08-23 14:11:06270 auto unrelated_navigation =
271 content::NavigationSimulator::CreateBrowserInitiated(GURL(kGoodURL),
272 web_contents());
mattmbfc4060d2015-12-18 23:11:38273 {
274 // Simulate subresource malware hit on the landing page.
jialiul792a6662016-12-03 01:44:10275 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38276 MakeUnsafeResource(kBadURL, true /* is_subresource */);
277
278 // Start pending load to unrelated site.
clamy511cf022017-08-23 14:11:06279 unrelated_navigation->Start();
mattmbfc4060d2015-12-18 23:11:38280
281 // Whitelist the resource on the landing page.
282 AddToWhitelist(resource);
283 EXPECT_TRUE(IsWhitelisted(resource));
284 }
285
286 // Commit the pending load of unrelated site.
clamy511cf022017-08-23 14:11:06287 unrelated_navigation->Commit();
mattmbfc4060d2015-12-18 23:11:38288 {
289 // The unrelated site is not on the whitelist, even if the same subresource
290 // was on it.
jialiul792a6662016-12-03 01:44:10291 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38292 MakeUnsafeResource(kBadURL, true /* is_subresource */);
293 EXPECT_FALSE(IsWhitelisted(resource));
294 }
295
296 // Navigate back to the original landing url.
297 NavigateAndCommit(GURL(kLandingURL));
298 {
jialiul792a6662016-12-03 01:44:10299 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38300 MakeUnsafeResource(kBadURL, true /* is_subresource */);
301 // Original resource url is whitelisted.
302 EXPECT_TRUE(IsWhitelisted(resource));
303 }
304 {
305 // A different malware subresource on the same page is also whitelisted.
306 // (The whitelist is by the page url, not the resource url.)
jialiul792a6662016-12-03 01:44:10307 security_interstitials::UnsafeResource resource2 =
mattmbfc4060d2015-12-18 23:11:38308 MakeUnsafeResource(kAnotherBadURL, true /* is_subresource */);
309 EXPECT_TRUE(IsWhitelisted(resource2));
310 }
311}
312
Evgenii Stepanov199c0132017-08-18 21:19:41313// Leaks memory. https://crbug.com/755118
314#if defined(LEAK_SANITIZER)
315#define MAYBE_UICallbackProceed DISABLED_UICallbackProceed
316#else
317#define MAYBE_UICallbackProceed UICallbackProceed
318#endif
319TEST_F(SafeBrowsingUIManagerTest, MAYBE_UICallbackProceed) {
jialiul792a6662016-12-03 01:44:10320 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38321 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41322 SafeBrowsingCallbackWaiter waiter;
323 resource.callback =
324 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
325 base::Unretained(&waiter));
326 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52327 base::CreateSingleThreadTaskRunner({BrowserThread::UI});
jialiul792a6662016-12-03 01:44:10328 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41329 resources.push_back(resource);
330 SimulateBlockingPageDone(resources, true);
331 EXPECT_TRUE(IsWhitelisted(resource));
332 waiter.WaitForCallback();
333 EXPECT_TRUE(waiter.callback_called());
334 EXPECT_TRUE(waiter.proceed());
335}
336
Evgenii Stepanov199c0132017-08-18 21:19:41337// Leaks memory. https://crbug.com/755118
338#if defined(LEAK_SANITIZER)
339#define MAYBE_UICallbackDontProceed DISABLED_UICallbackDontProceed
340#else
341#define MAYBE_UICallbackDontProceed UICallbackDontProceed
342#endif
343TEST_F(SafeBrowsingUIManagerTest, MAYBE_UICallbackDontProceed) {
jialiul792a6662016-12-03 01:44:10344 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38345 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41346 SafeBrowsingCallbackWaiter waiter;
347 resource.callback =
348 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
349 base::Unretained(&waiter));
350 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52351 base::CreateSingleThreadTaskRunner({BrowserThread::UI});
jialiul792a6662016-12-03 01:44:10352 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41353 resources.push_back(resource);
354 SimulateBlockingPageDone(resources, false);
355 EXPECT_FALSE(IsWhitelisted(resource));
356 waiter.WaitForCallback();
357 EXPECT_TRUE(waiter.callback_called());
358 EXPECT_FALSE(waiter.proceed());
359}
360
Evgenii Stepanov199c0132017-08-18 21:19:41361// Leaks memory. https://crbug.com/755118
362#if defined(LEAK_SANITIZER)
363#define MAYBE_IOCallbackProceed DISABLED_IOCallbackProceed
364#else
365#define MAYBE_IOCallbackProceed IOCallbackProceed
366#endif
367TEST_F(SafeBrowsingUIManagerTest, MAYBE_IOCallbackProceed) {
jialiul792a6662016-12-03 01:44:10368 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38369 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41370 SafeBrowsingCallbackWaiter waiter;
371 resource.callback =
372 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
373 base::Unretained(&waiter));
374 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52375 base::CreateSingleThreadTaskRunner({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10376 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41377 resources.push_back(resource);
378 SimulateBlockingPageDone(resources, true);
379 EXPECT_TRUE(IsWhitelisted(resource));
380 waiter.WaitForCallback();
381 EXPECT_TRUE(waiter.callback_called());
382 EXPECT_TRUE(waiter.proceed());
383}
384
Evgenii Stepanov199c0132017-08-18 21:19:41385// Leaks memory. https://crbug.com/755118
386#if defined(LEAK_SANITIZER)
387#define MAYBE_IOCallbackDontProceed DISABLED_IOCallbackDontProceed
388#else
389#define MAYBE_IOCallbackDontProceed IOCallbackDontProceed
390#endif
391TEST_F(SafeBrowsingUIManagerTest, MAYBE_IOCallbackDontProceed) {
jialiul792a6662016-12-03 01:44:10392 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38393 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41394 SafeBrowsingCallbackWaiter waiter;
395 resource.callback =
396 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
397 base::Unretained(&waiter));
398 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52399 base::CreateSingleThreadTaskRunner({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10400 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41401 resources.push_back(resource);
402 SimulateBlockingPageDone(resources, false);
403 EXPECT_FALSE(IsWhitelisted(resource));
404 waiter.WaitForCallback();
405 EXPECT_TRUE(waiter.callback_called());
406 EXPECT_FALSE(waiter.proceed());
407}
408
dalecurtis6c58ed02016-10-28 23:02:37409namespace {
410
411// A WebContentsDelegate that records whether
412// VisibleSecurityStateChanged() was called.
413class SecurityStateWebContentsDelegate : public content::WebContentsDelegate {
414 public:
415 SecurityStateWebContentsDelegate() {}
416 ~SecurityStateWebContentsDelegate() override {}
417
418 bool visible_security_state_changed() const {
419 return visible_security_state_changed_;
420 }
421
422 void ClearVisibleSecurityStateChanged() {
423 visible_security_state_changed_ = false;
424 }
425
426 // WebContentsDelegate:
427 void VisibleSecurityStateChanged(content::WebContents* source) override {
428 visible_security_state_changed_ = true;
429 }
430
431 private:
432 bool visible_security_state_changed_ = false;
433 DISALLOW_COPY_AND_ASSIGN(SecurityStateWebContentsDelegate);
434};
435
436// A test blocking page that does not create windows.
437class TestSafeBrowsingBlockingPage : public SafeBrowsingBlockingPage {
438 public:
jialiul3d6032e2017-01-12 00:41:31439 TestSafeBrowsingBlockingPage(BaseUIManager* manager,
dalecurtis6c58ed02016-10-28 23:02:37440 content::WebContents* web_contents,
441 const GURL& main_frame_url,
442 const UnsafeResourceList& unsafe_resources)
jialiul3d6032e2017-01-12 00:41:31443 : SafeBrowsingBlockingPage(
444 manager,
445 web_contents,
446 main_frame_url,
447 unsafe_resources,
edwardjungd7395fb02017-05-12 23:13:29448 BaseSafeBrowsingErrorUI::SBErrorDisplayOptions(
ntfschra5448fa2017-02-02 01:01:31449 BaseBlockingPage::IsMainPageLoadBlocked(unsafe_resources),
Carlos IL43dfc262019-11-27 19:40:31450 false, // is_extended_reporting_opt_in_allowed
451 false, // is_off_the_record
452 false, // is_extended_reporting_enabled
453 false, // is_extended_reporting_policy_managed
454 false, // is_proceed_anyway_disabled
455 true, // should_open_links_in_new_tab
456 true, // always_show_back_to_safety
457 "cpn_safe_browsing"), // help_center_article_link
458 true) { // should_trigger_reporting
dalecurtis6c58ed02016-10-28 23:02:37459 // Don't delay details at all for the unittest.
ntfschrfef42f92017-02-24 02:15:47460 SetThreatDetailsProceedDelayForTesting(0);
dalecurtis6c58ed02016-10-28 23:02:37461 DontCreateViewForTesting();
462 }
463};
464
465// A factory that creates TestSafeBrowsingBlockingPages.
466class TestSafeBrowsingBlockingPageFactory
467 : public SafeBrowsingBlockingPageFactory {
468 public:
469 TestSafeBrowsingBlockingPageFactory() {}
470 ~TestSafeBrowsingBlockingPageFactory() override {}
471
472 SafeBrowsingBlockingPage* CreateSafeBrowsingPage(
jialiul3d6032e2017-01-12 00:41:31473 BaseUIManager* delegate,
dalecurtis6c58ed02016-10-28 23:02:37474 content::WebContents* web_contents,
475 const GURL& main_frame_url,
Carlos IL43dfc262019-11-27 19:40:31476 const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
477 bool should_trigger_reporting) override {
dalecurtis6c58ed02016-10-28 23:02:37478 return new TestSafeBrowsingBlockingPage(delegate, web_contents,
479 main_frame_url, unsafe_resources);
480 }
481};
482
483} // namespace
484
485// Tests that the WebContentsDelegate is notified of a visible security
486// state change when a blocking page is shown for a subresource.
Evgenii Stepanov199c0132017-08-18 21:19:41487// Leaks memory. https://crbug.com/755118
488#if defined(LEAK_SANITIZER)
489#define MAYBE_VisibleSecurityStateChangedForUnsafeSubresource \
490 DISABLED_VisibleSecurityStateChangedForUnsafeSubresource
491#else
492#define MAYBE_VisibleSecurityStateChangedForUnsafeSubresource \
493 VisibleSecurityStateChangedForUnsafeSubresource
494#endif
dalecurtis6c58ed02016-10-28 23:02:37495TEST_F(SafeBrowsingUIManagerTest,
Evgenii Stepanov199c0132017-08-18 21:19:41496 MAYBE_VisibleSecurityStateChangedForUnsafeSubresource) {
dalecurtis6c58ed02016-10-28 23:02:37497 TestSafeBrowsingBlockingPageFactory factory;
498 SafeBrowsingBlockingPage::RegisterFactory(&factory);
499 SecurityStateWebContentsDelegate delegate;
500 web_contents()->SetDelegate(&delegate);
501
502 // Simulate a blocking page showing for an unsafe subresource.
jialiul792a6662016-12-03 01:44:10503 security_interstitials::UnsafeResource resource =
dalecurtis6c58ed02016-10-28 23:02:37504 MakeUnsafeResource(kBadURL, true /* is_subresource */);
505 // Needed for showing the blocking page.
506 resource.threat_source = safe_browsing::ThreatSource::REMOTE;
507 NavigateAndCommit(GURL("http://example.test"));
508
509 delegate.ClearVisibleSecurityStateChanged();
510 EXPECT_FALSE(delegate.visible_security_state_changed());
511 ui_manager()->DisplayBlockingPage(resource);
512 EXPECT_TRUE(delegate.visible_security_state_changed());
513
514 // Simulate proceeding through the blocking page.
515 SafeBrowsingCallbackWaiter waiter;
516 resource.callback =
517 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
518 base::Unretained(&waiter));
519 resource.callback_thread =
Sami Kyostilaad439ec2019-08-06 14:49:52520 base::CreateSingleThreadTaskRunner({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10521 std::vector<security_interstitials::UnsafeResource> resources;
dalecurtis6c58ed02016-10-28 23:02:37522 resources.push_back(resource);
523
524 delegate.ClearVisibleSecurityStateChanged();
525 EXPECT_FALSE(delegate.visible_security_state_changed());
526 SimulateBlockingPageDone(resources, true);
527 EXPECT_TRUE(delegate.visible_security_state_changed());
528
529 waiter.WaitForCallback();
530 EXPECT_TRUE(waiter.callback_called());
531 EXPECT_TRUE(waiter.proceed());
532 EXPECT_TRUE(IsWhitelisted(resource));
533}
534
vakh9a474d832015-11-13 01:43:09535} // namespace safe_browsing