blob: 6f248f8d6b9261582c04e6dea23142a40d7f8e72 [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"
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"
Ali Jumafb3dc1f2020-01-07 17:33:4718#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
19#include "components/safe_browsing/core/db/util.h"
Ali Jumaee602932020-01-24 16:39:1820#include "components/security_interstitials/content/unsafe_resource_util.h"
edwardjungd7395fb02017-05-12 23:13:2921#include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
Ali Jumaee602932020-01-24 16:39:1822#include "components/security_interstitials/core/unsafe_resource.h"
Eric Seckler8652dcd52018-09-20 10:42:2823#include "content/public/browser/browser_task_traits.h"
Gabriel Charettee7cdc5cd2020-05-27 23:35:0524#include "content/public/browser/browser_thread.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"
feltbc2eda2d2015-06-23 02:06:0334#include "testing/gtest/include/gtest/gtest.h"
35#include "url/gurl.h"
36
clamy4edbf0e2015-12-02 13:35:4137using content::BrowserThread;
38
feltfb118572015-08-18 05:22:0139static const char* kGoodURL = "https://www.good.com";
40static const char* kBadURL = "https://www.malware.com";
41static const char* kBadURLWithPath = "https://www.malware.com/index.html";
mattmbfc4060d2015-12-18 23:11:3842static const char* kAnotherBadURL = "https://www.badware.com";
43static const char* kLandingURL = "https://www.landing.com";
feltfb118572015-08-18 05:22:0144
vakh9a474d832015-11-13 01:43:0945namespace safe_browsing {
46
clamy4edbf0e2015-12-02 13:35:4147class SafeBrowsingCallbackWaiter {
48 public:
49 SafeBrowsingCallbackWaiter() {}
50
51 bool callback_called() const { return callback_called_; }
52 bool proceed() const { return proceed_; }
53
Carlos IL5edbd0d2020-01-28 01:27:4654 void OnBlockingPageDone(bool proceed, bool showed_interstitial) {
clamy4edbf0e2015-12-02 13:35:4155 DCHECK_CURRENTLY_ON(BrowserThread::UI);
56 callback_called_ = true;
57 proceed_ = proceed;
58 loop_.Quit();
59 }
60
Carlos IL5edbd0d2020-01-28 01:27:4661 void OnBlockingPageDoneOnIO(bool proceed, bool showed_interstitial) {
clamy4edbf0e2015-12-02 13:35:4162 DCHECK_CURRENTLY_ON(BrowserThread::IO);
Gabriel Charettee7cdc5cd2020-05-27 23:35:0563 content::GetUIThreadTaskRunner({})->PostTask(
64 FROM_HERE,
tzikb5f84b82017-04-20 00:55:2865 base::BindOnce(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
Carlos IL5edbd0d2020-01-28 01:27:4666 base::Unretained(this), proceed, showed_interstitial));
clamy4edbf0e2015-12-02 13:35:4167 }
68
69 void WaitForCallback() {
70 DCHECK_CURRENTLY_ON(BrowserThread::UI);
71 loop_.Run();
72 }
73
74 private:
75 bool callback_called_ = false;
76 bool proceed_ = false;
77 base::RunLoop loop_;
78};
79
feltfb118572015-08-18 05:22:0180class SafeBrowsingUIManagerTest : public ChromeRenderViewHostTestHarness {
feltbc2eda2d2015-06-23 02:06:0381 public:
Gabriel Charettecc8362b2017-09-20 21:59:4082 SafeBrowsingUIManagerTest()
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3283 : scoped_testing_local_state_(TestingBrowserProcess::GetGlobal()) {
kylecharb59c3d72019-10-29 05:26:2684 ui_manager_ = new SafeBrowsingUIManager(nullptr);
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3285 }
feltfb118572015-08-18 05:22:0186
juncai1ee189bd2017-06-09 04:25:4387 ~SafeBrowsingUIManagerTest() override {}
feltbc2eda2d2015-06-23 02:06:0388
clamy4edbf0e2015-12-02 13:35:4189 void SetUp() override {
clamy4edbf0e2015-12-02 13:35:4190 ChromeRenderViewHostTestHarness::SetUp();
estark1ca09ca2016-11-01 04:04:1291 SafeBrowsingUIManager::CreateWhitelistForTesting(web_contents());
Luke Zielinski12ef88552017-06-23 15:36:2792
93 safe_browsing::TestSafeBrowsingServiceFactory sb_service_factory;
94 auto* safe_browsing_service =
95 sb_service_factory.CreateSafeBrowsingService();
96 TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(
97 safe_browsing_service);
98 g_browser_process->safe_browsing_service()->Initialize();
99 // A profile was created already but SafeBrowsingService wasn't around to
100 // get notified of it, so include that notification now.
Evan Stade44fb6e382019-10-05 00:43:43101 safe_browsing_service->OnProfileAdded(
102 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
Ian Vollick381389a62019-06-26 16:49:40103 content::BrowserThread::RunAllPendingTasksOnThreadForTesting(
104 content::BrowserThread::IO);
clamy4edbf0e2015-12-02 13:35:41105 }
feltfb118572015-08-18 05:22:01106
Luke Zielinski12ef88552017-06-23 15:36:27107 void TearDown() override {
108 TestingBrowserProcess::GetGlobal()->safe_browsing_service()->ShutDown();
109 TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(nullptr);
John Abd-El-Malek1b3f5ca2019-06-06 16:42:32110
111 // Depends on LocalState from ChromeRenderViewHostTestHarness.
112 if (SystemNetworkContextManager::GetInstance())
113 SystemNetworkContextManager::DeleteInstance();
114
Luke Zielinski12ef88552017-06-23 15:36:27115 ChromeRenderViewHostTestHarness::TearDown();
116 }
feltfb118572015-08-18 05:22:01117
jialiul792a6662016-12-03 01:44:10118 bool IsWhitelisted(security_interstitials::UnsafeResource resource) {
feltbc2eda2d2015-06-23 02:06:03119 return ui_manager_->IsWhitelisted(resource);
120 }
121
jialiul792a6662016-12-03 01:44:10122 void AddToWhitelist(security_interstitials::UnsafeResource resource) {
estark1ca09ca2016-11-01 04:04:12123 ui_manager_->AddToWhitelistUrlSet(
124 SafeBrowsingUIManager::GetMainFrameWhitelistUrlForResourceForTesting(
125 resource),
estark7ffa8c62016-11-11 23:21:55126 web_contents(), false, resource.threat_type);
feltfb118572015-08-18 05:22:01127 }
128
jialiul792a6662016-12-03 01:44:10129 security_interstitials::UnsafeResource MakeUnsafeResource(
mattmbfc4060d2015-12-18 23:11:38130 const char* url,
131 bool is_subresource) {
jialiul792a6662016-12-03 01:44:10132 security_interstitials::UnsafeResource resource;
feltfb118572015-08-18 05:22:01133 resource.url = GURL(url);
mattmbfc4060d2015-12-18 23:11:38134 resource.is_subresource = is_subresource;
Ali Jumaee602932020-01-24 16:39:18135 resource.web_contents_getter = security_interstitials::GetWebContentsGetter(
136 web_contents()->GetMainFrame()->GetProcess()->GetID(),
137 web_contents()->GetMainFrame()->GetRoutingID());
feltfb118572015-08-18 05:22:01138 resource.threat_type = SB_THREAT_TYPE_URL_MALWARE;
139 return resource;
140 }
141
jialiul792a6662016-12-03 01:44:10142 security_interstitials::UnsafeResource MakeUnsafeResourceAndStartNavigation(
feltfb118572015-08-18 05:22:01143 const char* url) {
jialiul792a6662016-12-03 01:44:10144 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38145 MakeUnsafeResource(url, false /* is_subresource */);
feltfb118572015-08-18 05:22:01146
mattmbfc4060d2015-12-18 23:11:38147 // The WC doesn't have a URL without a navigation. A main-frame malware
148 // unsafe resource must be a pending navigation.
clamy511cf022017-08-23 14:11:06149 auto navigation = content::NavigationSimulator::CreateBrowserInitiated(
150 GURL(url), web_contents());
151 navigation->Start();
feltfb118572015-08-18 05:22:01152 return resource;
feltbc2eda2d2015-06-23 02:06:03153 }
154
clamy4edbf0e2015-12-02 13:35:41155 void SimulateBlockingPageDone(
jialiul792a6662016-12-03 01:44:10156 const std::vector<security_interstitials::UnsafeResource>& resources,
clamy4edbf0e2015-12-02 13:35:41157 bool proceed) {
estark1ca09ca2016-11-01 04:04:12158 GURL main_frame_url;
159 content::NavigationEntry* entry =
160 web_contents()->GetController().GetVisibleEntry();
161 if (entry)
162 main_frame_url = entry->GetURL();
163
164 ui_manager_->OnBlockingPageDone(resources, proceed, web_contents(),
Carlos IL5edbd0d2020-01-28 01:27:46165 main_frame_url,
166 true /* showed_interstitial */);
clamy4edbf0e2015-12-02 13:35:41167 }
168
dalecurtis6c58ed02016-10-28 23:02:37169 protected:
170 SafeBrowsingUIManager* ui_manager() { return ui_manager_.get(); }
171
feltbc2eda2d2015-06-23 02:06:03172 private:
173 scoped_refptr<SafeBrowsingUIManager> ui_manager_;
John Abd-El-Malek1b3f5ca2019-06-06 16:42:32174 ScopedTestingLocalState scoped_testing_local_state_;
feltbc2eda2d2015-06-23 02:06:03175};
176
Marc Treib3d26e922017-08-14 16:58:26177// Leaks memory. https://crbug.com/755118
178#if defined(LEAK_SANITIZER)
179#define MAYBE_Whitelist DISABLED_Whitelist
180#else
181#define MAYBE_Whitelist Whitelist
182#endif
183TEST_F(SafeBrowsingUIManagerTest, MAYBE_Whitelist) {
jialiul792a6662016-12-03 01:44:10184 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38185 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltbc2eda2d2015-06-23 02:06:03186 AddToWhitelist(resource);
187 EXPECT_TRUE(IsWhitelisted(resource));
188}
189
Marc Treib3d26e922017-08-14 16:58:26190// Leaks memory. https://crbug.com/755118
191#if defined(LEAK_SANITIZER)
192#define MAYBE_WhitelistIgnoresSitesNotAdded \
193 DISABLED_WhitelistIgnoresSitesNotAdded
194#else
195#define MAYBE_WhitelistIgnoresSitesNotAdded WhitelistIgnoresSitesNotAdded
196#endif
197TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresSitesNotAdded) {
jialiul792a6662016-12-03 01:44:10198 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38199 MakeUnsafeResourceAndStartNavigation(kGoodURL);
feltbc2eda2d2015-06-23 02:06:03200 EXPECT_FALSE(IsWhitelisted(resource));
feltfb118572015-08-18 05:22:01201}
202
Marc Treib3d26e922017-08-14 16:58:26203// Leaks memory. https://crbug.com/755118
204#if defined(LEAK_SANITIZER)
205#define MAYBE_WhitelistRemembersThreatType DISABLED_WhitelistRemembersThreatType
206#else
207#define MAYBE_WhitelistRemembersThreatType WhitelistRemembersThreatType
208#endif
209TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistRemembersThreatType) {
jialiul792a6662016-12-03 01:44:10210 security_interstitials::UnsafeResource resource =
estark7ffa8c62016-11-11 23:21:55211 MakeUnsafeResourceAndStartNavigation(kBadURL);
212 AddToWhitelist(resource);
213 EXPECT_TRUE(IsWhitelisted(resource));
214 SBThreatType threat_type;
215 content::NavigationEntry* entry =
216 web_contents()->GetController().GetVisibleEntry();
217 ASSERT_TRUE(entry);
218 EXPECT_TRUE(ui_manager()->IsUrlWhitelistedOrPendingForWebContents(
219 resource.url, resource.is_subresource, entry,
220 resource.web_contents_getter.Run(), true, &threat_type));
221 EXPECT_EQ(resource.threat_type, threat_type);
222}
223
Marc Treib3d26e922017-08-14 16:58:26224// Leaks memory. https://crbug.com/755118
225#if defined(LEAK_SANITIZER)
226#define MAYBE_WhitelistIgnoresPath DISABLED_WhitelistIgnoresPath
227#else
228#define MAYBE_WhitelistIgnoresPath WhitelistIgnoresPath
229#endif
230TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresPath) {
jialiul792a6662016-12-03 01:44:10231 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38232 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltbc2eda2d2015-06-23 02:06:03233 AddToWhitelist(resource);
234 EXPECT_TRUE(IsWhitelisted(resource));
feltfb118572015-08-18 05:22:01235
mattmbfc4060d2015-12-18 23:11:38236 content::WebContentsTester::For(web_contents())->CommitPendingNavigation();
237
jialiul792a6662016-12-03 01:44:10238 security_interstitials::UnsafeResource resource_path =
mattmbfc4060d2015-12-18 23:11:38239 MakeUnsafeResourceAndStartNavigation(kBadURLWithPath);
feltfb118572015-08-18 05:22:01240 EXPECT_TRUE(IsWhitelisted(resource_path));
feltbc2eda2d2015-06-23 02:06:03241}
242
Marc Treib3d26e922017-08-14 16:58:26243// Leaks memory. https://crbug.com/755118
244#if defined(LEAK_SANITIZER)
245#define MAYBE_WhitelistIgnoresThreatType DISABLED_WhitelistIgnoresThreatType
246#else
247#define MAYBE_WhitelistIgnoresThreatType WhitelistIgnoresThreatType
248#endif
249TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresThreatType) {
jialiul792a6662016-12-03 01:44:10250 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38251 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltfb118572015-08-18 05:22:01252 AddToWhitelist(resource);
253 EXPECT_TRUE(IsWhitelisted(resource));
feltbc2eda2d2015-06-23 02:06:03254
jialiul792a6662016-12-03 01:44:10255 security_interstitials::UnsafeResource resource_phishing =
mattmbfc4060d2015-12-18 23:11:38256 MakeUnsafeResource(kBadURL, false /* is_subresource */);
feltfb118572015-08-18 05:22:01257 resource_phishing.threat_type = SB_THREAT_TYPE_URL_PHISHING;
258 EXPECT_TRUE(IsWhitelisted(resource_phishing));
feltbc2eda2d2015-06-23 02:06:03259}
260
Marc Treib3d26e922017-08-14 16:58:26261// Leaks memory. https://crbug.com/755118
262#if defined(LEAK_SANITIZER)
263#define MAYBE_WhitelistWithUnrelatedPendingLoad \
264 DISABLED_WhitelistWithUnrelatedPendingLoad
265#else
266#define MAYBE_WhitelistWithUnrelatedPendingLoad \
267 WhitelistWithUnrelatedPendingLoad
268#endif
269TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistWithUnrelatedPendingLoad) {
mattmbfc4060d2015-12-18 23:11:38270 // Commit load of landing page.
271 NavigateAndCommit(GURL(kLandingURL));
clamy511cf022017-08-23 14:11:06272 auto unrelated_navigation =
273 content::NavigationSimulator::CreateBrowserInitiated(GURL(kGoodURL),
274 web_contents());
mattmbfc4060d2015-12-18 23:11:38275 {
276 // Simulate subresource malware hit on the landing page.
jialiul792a6662016-12-03 01:44:10277 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38278 MakeUnsafeResource(kBadURL, true /* is_subresource */);
279
280 // Start pending load to unrelated site.
clamy511cf022017-08-23 14:11:06281 unrelated_navigation->Start();
mattmbfc4060d2015-12-18 23:11:38282
283 // Whitelist the resource on the landing page.
284 AddToWhitelist(resource);
285 EXPECT_TRUE(IsWhitelisted(resource));
286 }
287
288 // Commit the pending load of unrelated site.
clamy511cf022017-08-23 14:11:06289 unrelated_navigation->Commit();
mattmbfc4060d2015-12-18 23:11:38290 {
291 // The unrelated site is not on the whitelist, even if the same subresource
292 // was on it.
jialiul792a6662016-12-03 01:44:10293 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38294 MakeUnsafeResource(kBadURL, true /* is_subresource */);
295 EXPECT_FALSE(IsWhitelisted(resource));
296 }
297
298 // Navigate back to the original landing url.
299 NavigateAndCommit(GURL(kLandingURL));
300 {
jialiul792a6662016-12-03 01:44:10301 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38302 MakeUnsafeResource(kBadURL, true /* is_subresource */);
303 // Original resource url is whitelisted.
304 EXPECT_TRUE(IsWhitelisted(resource));
305 }
306 {
307 // A different malware subresource on the same page is also whitelisted.
308 // (The whitelist is by the page url, not the resource url.)
jialiul792a6662016-12-03 01:44:10309 security_interstitials::UnsafeResource resource2 =
mattmbfc4060d2015-12-18 23:11:38310 MakeUnsafeResource(kAnotherBadURL, true /* is_subresource */);
311 EXPECT_TRUE(IsWhitelisted(resource2));
312 }
313}
314
Evgenii Stepanov199c0132017-08-18 21:19:41315// Leaks memory. https://crbug.com/755118
316#if defined(LEAK_SANITIZER)
317#define MAYBE_UICallbackProceed DISABLED_UICallbackProceed
318#else
319#define MAYBE_UICallbackProceed UICallbackProceed
320#endif
321TEST_F(SafeBrowsingUIManagerTest, MAYBE_UICallbackProceed) {
jialiul792a6662016-12-03 01:44:10322 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38323 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41324 SafeBrowsingCallbackWaiter waiter;
325 resource.callback =
326 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
327 base::Unretained(&waiter));
Gabriel Charettee7cdc5cd2020-05-27 23:35:05328 resource.callback_thread = content::GetUIThreadTaskRunner({});
jialiul792a6662016-12-03 01:44:10329 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41330 resources.push_back(resource);
331 SimulateBlockingPageDone(resources, true);
332 EXPECT_TRUE(IsWhitelisted(resource));
333 waiter.WaitForCallback();
334 EXPECT_TRUE(waiter.callback_called());
335 EXPECT_TRUE(waiter.proceed());
336}
337
Evgenii Stepanov199c0132017-08-18 21:19:41338// Leaks memory. https://crbug.com/755118
339#if defined(LEAK_SANITIZER)
340#define MAYBE_UICallbackDontProceed DISABLED_UICallbackDontProceed
341#else
342#define MAYBE_UICallbackDontProceed UICallbackDontProceed
343#endif
344TEST_F(SafeBrowsingUIManagerTest, MAYBE_UICallbackDontProceed) {
jialiul792a6662016-12-03 01:44:10345 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38346 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41347 SafeBrowsingCallbackWaiter waiter;
348 resource.callback =
349 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
350 base::Unretained(&waiter));
Gabriel Charettee7cdc5cd2020-05-27 23:35:05351 resource.callback_thread = content::GetUIThreadTaskRunner({});
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));
Gabriel Charettee7cdc5cd2020-05-27 23:35:05374 resource.callback_thread = content::GetIOThreadTaskRunner({});
jialiul792a6662016-12-03 01:44:10375 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41376 resources.push_back(resource);
377 SimulateBlockingPageDone(resources, true);
378 EXPECT_TRUE(IsWhitelisted(resource));
379 waiter.WaitForCallback();
380 EXPECT_TRUE(waiter.callback_called());
381 EXPECT_TRUE(waiter.proceed());
382}
383
Evgenii Stepanov199c0132017-08-18 21:19:41384// Leaks memory. https://crbug.com/755118
385#if defined(LEAK_SANITIZER)
386#define MAYBE_IOCallbackDontProceed DISABLED_IOCallbackDontProceed
387#else
388#define MAYBE_IOCallbackDontProceed IOCallbackDontProceed
389#endif
390TEST_F(SafeBrowsingUIManagerTest, MAYBE_IOCallbackDontProceed) {
jialiul792a6662016-12-03 01:44:10391 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38392 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41393 SafeBrowsingCallbackWaiter waiter;
394 resource.callback =
395 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
396 base::Unretained(&waiter));
Gabriel Charettee7cdc5cd2020-05-27 23:35:05397 resource.callback_thread = content::GetIOThreadTaskRunner({});
jialiul792a6662016-12-03 01:44:10398 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41399 resources.push_back(resource);
400 SimulateBlockingPageDone(resources, false);
401 EXPECT_FALSE(IsWhitelisted(resource));
402 waiter.WaitForCallback();
403 EXPECT_TRUE(waiter.callback_called());
404 EXPECT_FALSE(waiter.proceed());
405}
406
dalecurtis6c58ed02016-10-28 23:02:37407namespace {
408
409// A WebContentsDelegate that records whether
410// VisibleSecurityStateChanged() was called.
411class SecurityStateWebContentsDelegate : public content::WebContentsDelegate {
412 public:
413 SecurityStateWebContentsDelegate() {}
414 ~SecurityStateWebContentsDelegate() override {}
415
416 bool visible_security_state_changed() const {
417 return visible_security_state_changed_;
418 }
419
420 void ClearVisibleSecurityStateChanged() {
421 visible_security_state_changed_ = false;
422 }
423
424 // WebContentsDelegate:
425 void VisibleSecurityStateChanged(content::WebContents* source) override {
426 visible_security_state_changed_ = true;
427 }
428
429 private:
430 bool visible_security_state_changed_ = false;
431 DISALLOW_COPY_AND_ASSIGN(SecurityStateWebContentsDelegate);
432};
433
434// A test blocking page that does not create windows.
435class TestSafeBrowsingBlockingPage : public SafeBrowsingBlockingPage {
436 public:
jialiul3d6032e2017-01-12 00:41:31437 TestSafeBrowsingBlockingPage(BaseUIManager* manager,
dalecurtis6c58ed02016-10-28 23:02:37438 content::WebContents* web_contents,
439 const GURL& main_frame_url,
440 const UnsafeResourceList& unsafe_resources)
jialiul3d6032e2017-01-12 00:41:31441 : SafeBrowsingBlockingPage(
442 manager,
443 web_contents,
444 main_frame_url,
445 unsafe_resources,
edwardjungd7395fb02017-05-12 23:13:29446 BaseSafeBrowsingErrorUI::SBErrorDisplayOptions(
ntfschra5448fa2017-02-02 01:01:31447 BaseBlockingPage::IsMainPageLoadBlocked(unsafe_resources),
Carlos IL43dfc262019-11-27 19:40:31448 false, // is_extended_reporting_opt_in_allowed
449 false, // is_off_the_record
450 false, // is_extended_reporting_enabled
451 false, // is_extended_reporting_policy_managed
Bettina460d9952020-03-23 19:44:01452 false, // is_enhanced_protection_enabled
Carlos IL43dfc262019-11-27 19:40:31453 false, // is_proceed_anyway_disabled
454 true, // should_open_links_in_new_tab
455 true, // always_show_back_to_safety
Xinghui Lu4dba30c2020-10-12 23:13:11456 false, // is_enhanced_protection_message_enabled
457 false, // is_safe_browsing_managed
Carlos IL43dfc262019-11-27 19:40:31458 "cpn_safe_browsing"), // help_center_article_link
459 true) { // should_trigger_reporting
dalecurtis6c58ed02016-10-28 23:02:37460 // Don't delay details at all for the unittest.
ntfschrfef42f92017-02-24 02:15:47461 SetThreatDetailsProceedDelayForTesting(0);
dalecurtis6c58ed02016-10-28 23:02:37462 DontCreateViewForTesting();
463 }
464};
465
466// A factory that creates TestSafeBrowsingBlockingPages.
467class TestSafeBrowsingBlockingPageFactory
468 : public SafeBrowsingBlockingPageFactory {
469 public:
470 TestSafeBrowsingBlockingPageFactory() {}
471 ~TestSafeBrowsingBlockingPageFactory() override {}
472
473 SafeBrowsingBlockingPage* CreateSafeBrowsingPage(
jialiul3d6032e2017-01-12 00:41:31474 BaseUIManager* delegate,
dalecurtis6c58ed02016-10-28 23:02:37475 content::WebContents* web_contents,
476 const GURL& main_frame_url,
Carlos IL43dfc262019-11-27 19:40:31477 const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
478 bool should_trigger_reporting) override {
dalecurtis6c58ed02016-10-28 23:02:37479 return new TestSafeBrowsingBlockingPage(delegate, web_contents,
480 main_frame_url, unsafe_resources);
481 }
482};
483
484} // namespace
485
486// Tests that the WebContentsDelegate is notified of a visible security
487// state change when a blocking page is shown for a subresource.
Evgenii Stepanov199c0132017-08-18 21:19:41488// Leaks memory. https://crbug.com/755118
489#if defined(LEAK_SANITIZER)
490#define MAYBE_VisibleSecurityStateChangedForUnsafeSubresource \
491 DISABLED_VisibleSecurityStateChangedForUnsafeSubresource
492#else
493#define MAYBE_VisibleSecurityStateChangedForUnsafeSubresource \
494 VisibleSecurityStateChangedForUnsafeSubresource
495#endif
dalecurtis6c58ed02016-10-28 23:02:37496TEST_F(SafeBrowsingUIManagerTest,
Evgenii Stepanov199c0132017-08-18 21:19:41497 MAYBE_VisibleSecurityStateChangedForUnsafeSubresource) {
dalecurtis6c58ed02016-10-28 23:02:37498 TestSafeBrowsingBlockingPageFactory factory;
499 SafeBrowsingBlockingPage::RegisterFactory(&factory);
500 SecurityStateWebContentsDelegate delegate;
501 web_contents()->SetDelegate(&delegate);
502
503 // Simulate a blocking page showing for an unsafe subresource.
jialiul792a6662016-12-03 01:44:10504 security_interstitials::UnsafeResource resource =
dalecurtis6c58ed02016-10-28 23:02:37505 MakeUnsafeResource(kBadURL, true /* is_subresource */);
506 // Needed for showing the blocking page.
507 resource.threat_source = safe_browsing::ThreatSource::REMOTE;
Carlos ILe7464b9c2020-01-18 01:38:30508
dalecurtis6c58ed02016-10-28 23:02:37509 NavigateAndCommit(GURL("http://example.test"));
510
511 delegate.ClearVisibleSecurityStateChanged();
512 EXPECT_FALSE(delegate.visible_security_state_changed());
513 ui_manager()->DisplayBlockingPage(resource);
514 EXPECT_TRUE(delegate.visible_security_state_changed());
515
516 // Simulate proceeding through the blocking page.
517 SafeBrowsingCallbackWaiter waiter;
518 resource.callback =
519 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
520 base::Unretained(&waiter));
Gabriel Charettee7cdc5cd2020-05-27 23:35:05521 resource.callback_thread = content::GetIOThreadTaskRunner({});
jialiul792a6662016-12-03 01:44:10522 std::vector<security_interstitials::UnsafeResource> resources;
dalecurtis6c58ed02016-10-28 23:02:37523 resources.push_back(resource);
524
525 delegate.ClearVisibleSecurityStateChanged();
526 EXPECT_FALSE(delegate.visible_security_state_changed());
527 SimulateBlockingPageDone(resources, true);
528 EXPECT_TRUE(delegate.visible_security_state_changed());
529
530 waiter.WaitForCallback();
531 EXPECT_TRUE(waiter.callback_called());
532 EXPECT_TRUE(waiter.proceed());
533 EXPECT_TRUE(IsWhitelisted(resource));
534}
535
Daniel Ruberya5af634d2020-03-03 23:24:40536TEST_F(SafeBrowsingUIManagerTest, ShowBlockPageNoCallback) {
537 TestSafeBrowsingBlockingPageFactory factory;
538 SafeBrowsingBlockingPage::RegisterFactory(&factory);
539 SecurityStateWebContentsDelegate delegate;
540 web_contents()->SetDelegate(&delegate);
541
542 // Simulate a blocking page showing for an unsafe subresource.
543 security_interstitials::UnsafeResource resource =
544 MakeUnsafeResource(kBadURL, false /* is_subresource */);
545 // Needed for showing the blocking page.
546 resource.threat_source = safe_browsing::ThreatSource::REMOTE;
547
548 // This call caused a crash in https://crbug.com/1058094. Just verify that we
549 // don't crash anymore.
550 ui_manager()->DisplayBlockingPage(resource);
551}
552
vakh9a474d832015-11-13 01:43:09553} // namespace safe_browsing