blob: bd8402f6c58eb0eb683e87b0a464b846b4d09742 [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 "base/test/scoped_feature_list.h"
11#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"
timvolodine89cf11712017-05-15 18:05:0719#include "components/safe_browsing/common/safe_browsing_prefs.h"
Tim Volodinee45938472017-09-21 10:08:2220#include "components/safe_browsing/db/util.h"
edwardjungd7395fb02017-05-12 23:13:2921#include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
Eric Seckler8652dcd52018-09-20 10:42:2822#include "content/public/browser/browser_task_traits.h"
estark1ca09ca2016-11-01 04:04:1223#include "content/public/browser/navigation_entry.h"
Lukasz Anforowiczb55fc492017-10-02 18:38:3424#include "content/public/browser/render_frame_host.h"
feltfb118572015-08-18 05:22:0125#include "content/public/browser/render_process_host.h"
26#include "content/public/browser/render_view_host.h"
27#include "content/public/browser/web_contents.h"
dalecurtis6c58ed02016-10-28 23:02:3728#include "content/public/browser/web_contents_delegate.h"
clamy511cf022017-08-23 14:11:0629#include "content/public/test/navigation_simulator.h"
feltbc2eda2d2015-06-23 02:06:0330#include "content/public/test/test_browser_thread_bundle.h"
feltfb118572015-08-18 05:22:0131#include "content/public/test/web_contents_tester.h"
Helen Lifa36ad62018-06-01 19:52:5932#include "net/url_request/url_request_test_util.h"
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3233#include "services/network/public/cpp/features.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
54 void OnBlockingPageDone(bool proceed) {
55 DCHECK_CURRENTLY_ON(BrowserThread::UI);
56 callback_called_ = true;
57 proceed_ = proceed;
58 loop_.Quit();
59 }
60
61 void OnBlockingPageDoneOnIO(bool proceed) {
62 DCHECK_CURRENTLY_ON(BrowserThread::IO);
Eric Seckler8652dcd52018-09-20 10:42:2863 base::PostTaskWithTraits(
64 FROM_HERE, {BrowserThread::UI},
tzikb5f84b82017-04-20 00:55:2865 base::BindOnce(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
66 base::Unretained(this), proceed));
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()) {
84 ui_manager_ = new SafeBrowsingUIManager(NULL);
85 }
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 {
John Abd-El-Malek1b3f5ca2019-06-06 16:42:3290 // Need to use the network service path because we've removed the
91 // URLRequestContext path in src/chrome and unit_tests currently are running
92 // with network service disabled. https://crbug.com/966633
93 feature_list_.InitAndEnableFeature(network::features::kNetworkService);
94
clamy4edbf0e2015-12-02 13:35:4195 ChromeRenderViewHostTestHarness::SetUp();
estark1ca09ca2016-11-01 04:04:1296 SafeBrowsingUIManager::CreateWhitelistForTesting(web_contents());
Luke Zielinski12ef88552017-06-23 15:36:2797
98 safe_browsing::TestSafeBrowsingServiceFactory sb_service_factory;
99 auto* safe_browsing_service =
100 sb_service_factory.CreateSafeBrowsingService();
Luke Zielinski12ef88552017-06-23 15:36:27101 TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(
102 safe_browsing_service);
103 g_browser_process->safe_browsing_service()->Initialize();
104 // A profile was created already but SafeBrowsingService wasn't around to
105 // get notified of it, so include that notification now.
106 safe_browsing_service->AddPrefService(
107 Profile::FromBrowserContext(web_contents()->GetBrowserContext())
108 ->GetPrefs());
clamy4edbf0e2015-12-02 13:35:41109 }
feltfb118572015-08-18 05:22:01110
Luke Zielinski12ef88552017-06-23 15:36:27111 void TearDown() override {
112 TestingBrowserProcess::GetGlobal()->safe_browsing_service()->ShutDown();
113 TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(nullptr);
John Abd-El-Malek1b3f5ca2019-06-06 16:42:32114
115 // Depends on LocalState from ChromeRenderViewHostTestHarness.
116 if (SystemNetworkContextManager::GetInstance())
117 SystemNetworkContextManager::DeleteInstance();
118
Luke Zielinski12ef88552017-06-23 15:36:27119 ChromeRenderViewHostTestHarness::TearDown();
120 }
feltfb118572015-08-18 05:22:01121
jialiul792a6662016-12-03 01:44:10122 bool IsWhitelisted(security_interstitials::UnsafeResource resource) {
feltbc2eda2d2015-06-23 02:06:03123 return ui_manager_->IsWhitelisted(resource);
124 }
125
jialiul792a6662016-12-03 01:44:10126 void AddToWhitelist(security_interstitials::UnsafeResource resource) {
estark1ca09ca2016-11-01 04:04:12127 ui_manager_->AddToWhitelistUrlSet(
128 SafeBrowsingUIManager::GetMainFrameWhitelistUrlForResourceForTesting(
129 resource),
estark7ffa8c62016-11-11 23:21:55130 web_contents(), false, resource.threat_type);
feltfb118572015-08-18 05:22:01131 }
132
jialiul792a6662016-12-03 01:44:10133 security_interstitials::UnsafeResource MakeUnsafeResource(
mattmbfc4060d2015-12-18 23:11:38134 const char* url,
135 bool is_subresource) {
jialiul792a6662016-12-03 01:44:10136 security_interstitials::UnsafeResource resource;
feltfb118572015-08-18 05:22:01137 resource.url = GURL(url);
mattmbfc4060d2015-12-18 23:11:38138 resource.is_subresource = is_subresource;
scottmg22e4f25a2016-08-15 21:09:03139 resource.web_contents_getter =
jialiul792a6662016-12-03 01:44:10140 security_interstitials::UnsafeResource::GetWebContentsGetter(
Lukasz Anforowiczb55fc492017-10-02 18:38:34141 web_contents()->GetMainFrame()->GetProcess()->GetID(),
scottmg22e4f25a2016-08-15 21:09:03142 web_contents()->GetMainFrame()->GetRoutingID());
feltfb118572015-08-18 05:22:01143 resource.threat_type = SB_THREAT_TYPE_URL_MALWARE;
144 return resource;
145 }
146
jialiul792a6662016-12-03 01:44:10147 security_interstitials::UnsafeResource MakeUnsafeResourceAndStartNavigation(
feltfb118572015-08-18 05:22:01148 const char* url) {
jialiul792a6662016-12-03 01:44:10149 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38150 MakeUnsafeResource(url, false /* is_subresource */);
feltfb118572015-08-18 05:22:01151
mattmbfc4060d2015-12-18 23:11:38152 // The WC doesn't have a URL without a navigation. A main-frame malware
153 // unsafe resource must be a pending navigation.
clamy511cf022017-08-23 14:11:06154 auto navigation = content::NavigationSimulator::CreateBrowserInitiated(
155 GURL(url), web_contents());
156 navigation->Start();
feltfb118572015-08-18 05:22:01157 return resource;
feltbc2eda2d2015-06-23 02:06:03158 }
159
clamy4edbf0e2015-12-02 13:35:41160 void SimulateBlockingPageDone(
jialiul792a6662016-12-03 01:44:10161 const std::vector<security_interstitials::UnsafeResource>& resources,
clamy4edbf0e2015-12-02 13:35:41162 bool proceed) {
estark1ca09ca2016-11-01 04:04:12163 GURL main_frame_url;
164 content::NavigationEntry* entry =
165 web_contents()->GetController().GetVisibleEntry();
166 if (entry)
167 main_frame_url = entry->GetURL();
168
169 ui_manager_->OnBlockingPageDone(resources, proceed, web_contents(),
170 main_frame_url);
clamy4edbf0e2015-12-02 13:35:41171 }
172
dalecurtis6c58ed02016-10-28 23:02:37173 protected:
174 SafeBrowsingUIManager* ui_manager() { return ui_manager_.get(); }
175
feltbc2eda2d2015-06-23 02:06:03176 private:
feltbc2eda2d2015-06-23 02:06:03177 scoped_refptr<SafeBrowsingUIManager> ui_manager_;
John Abd-El-Malek1b3f5ca2019-06-06 16:42:32178 base::test::ScopedFeatureList feature_list_;
179 ScopedTestingLocalState scoped_testing_local_state_;
feltbc2eda2d2015-06-23 02:06:03180};
181
Marc Treib3d26e922017-08-14 16:58:26182// Leaks memory. https://crbug.com/755118
183#if defined(LEAK_SANITIZER)
184#define MAYBE_Whitelist DISABLED_Whitelist
185#else
186#define MAYBE_Whitelist Whitelist
187#endif
188TEST_F(SafeBrowsingUIManagerTest, MAYBE_Whitelist) {
jialiul792a6662016-12-03 01:44:10189 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38190 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltbc2eda2d2015-06-23 02:06:03191 AddToWhitelist(resource);
192 EXPECT_TRUE(IsWhitelisted(resource));
193}
194
Marc Treib3d26e922017-08-14 16:58:26195// Leaks memory. https://crbug.com/755118
196#if defined(LEAK_SANITIZER)
197#define MAYBE_WhitelistIgnoresSitesNotAdded \
198 DISABLED_WhitelistIgnoresSitesNotAdded
199#else
200#define MAYBE_WhitelistIgnoresSitesNotAdded WhitelistIgnoresSitesNotAdded
201#endif
202TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresSitesNotAdded) {
jialiul792a6662016-12-03 01:44:10203 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38204 MakeUnsafeResourceAndStartNavigation(kGoodURL);
feltbc2eda2d2015-06-23 02:06:03205 EXPECT_FALSE(IsWhitelisted(resource));
feltfb118572015-08-18 05:22:01206}
207
Marc Treib3d26e922017-08-14 16:58:26208// Leaks memory. https://crbug.com/755118
209#if defined(LEAK_SANITIZER)
210#define MAYBE_WhitelistRemembersThreatType DISABLED_WhitelistRemembersThreatType
211#else
212#define MAYBE_WhitelistRemembersThreatType WhitelistRemembersThreatType
213#endif
214TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistRemembersThreatType) {
jialiul792a6662016-12-03 01:44:10215 security_interstitials::UnsafeResource resource =
estark7ffa8c62016-11-11 23:21:55216 MakeUnsafeResourceAndStartNavigation(kBadURL);
217 AddToWhitelist(resource);
218 EXPECT_TRUE(IsWhitelisted(resource));
219 SBThreatType threat_type;
220 content::NavigationEntry* entry =
221 web_contents()->GetController().GetVisibleEntry();
222 ASSERT_TRUE(entry);
223 EXPECT_TRUE(ui_manager()->IsUrlWhitelistedOrPendingForWebContents(
224 resource.url, resource.is_subresource, entry,
225 resource.web_contents_getter.Run(), true, &threat_type));
226 EXPECT_EQ(resource.threat_type, threat_type);
227}
228
Marc Treib3d26e922017-08-14 16:58:26229// Leaks memory. https://crbug.com/755118
230#if defined(LEAK_SANITIZER)
231#define MAYBE_WhitelistIgnoresPath DISABLED_WhitelistIgnoresPath
232#else
233#define MAYBE_WhitelistIgnoresPath WhitelistIgnoresPath
234#endif
235TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresPath) {
jialiul792a6662016-12-03 01:44:10236 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38237 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltbc2eda2d2015-06-23 02:06:03238 AddToWhitelist(resource);
239 EXPECT_TRUE(IsWhitelisted(resource));
feltfb118572015-08-18 05:22:01240
mattmbfc4060d2015-12-18 23:11:38241 content::WebContentsTester::For(web_contents())->CommitPendingNavigation();
242
jialiul792a6662016-12-03 01:44:10243 security_interstitials::UnsafeResource resource_path =
mattmbfc4060d2015-12-18 23:11:38244 MakeUnsafeResourceAndStartNavigation(kBadURLWithPath);
feltfb118572015-08-18 05:22:01245 EXPECT_TRUE(IsWhitelisted(resource_path));
feltbc2eda2d2015-06-23 02:06:03246}
247
Marc Treib3d26e922017-08-14 16:58:26248// Leaks memory. https://crbug.com/755118
249#if defined(LEAK_SANITIZER)
250#define MAYBE_WhitelistIgnoresThreatType DISABLED_WhitelistIgnoresThreatType
251#else
252#define MAYBE_WhitelistIgnoresThreatType WhitelistIgnoresThreatType
253#endif
254TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresThreatType) {
jialiul792a6662016-12-03 01:44:10255 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38256 MakeUnsafeResourceAndStartNavigation(kBadURL);
feltfb118572015-08-18 05:22:01257 AddToWhitelist(resource);
258 EXPECT_TRUE(IsWhitelisted(resource));
feltbc2eda2d2015-06-23 02:06:03259
jialiul792a6662016-12-03 01:44:10260 security_interstitials::UnsafeResource resource_phishing =
mattmbfc4060d2015-12-18 23:11:38261 MakeUnsafeResource(kBadURL, false /* is_subresource */);
feltfb118572015-08-18 05:22:01262 resource_phishing.threat_type = SB_THREAT_TYPE_URL_PHISHING;
263 EXPECT_TRUE(IsWhitelisted(resource_phishing));
feltbc2eda2d2015-06-23 02:06:03264}
265
Marc Treib3d26e922017-08-14 16:58:26266// Leaks memory. https://crbug.com/755118
267#if defined(LEAK_SANITIZER)
268#define MAYBE_WhitelistWithUnrelatedPendingLoad \
269 DISABLED_WhitelistWithUnrelatedPendingLoad
270#else
271#define MAYBE_WhitelistWithUnrelatedPendingLoad \
272 WhitelistWithUnrelatedPendingLoad
273#endif
274TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistWithUnrelatedPendingLoad) {
mattmbfc4060d2015-12-18 23:11:38275 // Commit load of landing page.
276 NavigateAndCommit(GURL(kLandingURL));
clamy511cf022017-08-23 14:11:06277 auto unrelated_navigation =
278 content::NavigationSimulator::CreateBrowserInitiated(GURL(kGoodURL),
279 web_contents());
mattmbfc4060d2015-12-18 23:11:38280 {
281 // Simulate subresource malware hit on the landing page.
jialiul792a6662016-12-03 01:44:10282 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38283 MakeUnsafeResource(kBadURL, true /* is_subresource */);
284
285 // Start pending load to unrelated site.
clamy511cf022017-08-23 14:11:06286 unrelated_navigation->Start();
mattmbfc4060d2015-12-18 23:11:38287
288 // Whitelist the resource on the landing page.
289 AddToWhitelist(resource);
290 EXPECT_TRUE(IsWhitelisted(resource));
291 }
292
293 // Commit the pending load of unrelated site.
clamy511cf022017-08-23 14:11:06294 unrelated_navigation->Commit();
mattmbfc4060d2015-12-18 23:11:38295 {
296 // The unrelated site is not on the whitelist, even if the same subresource
297 // was on it.
jialiul792a6662016-12-03 01:44:10298 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38299 MakeUnsafeResource(kBadURL, true /* is_subresource */);
300 EXPECT_FALSE(IsWhitelisted(resource));
301 }
302
303 // Navigate back to the original landing url.
304 NavigateAndCommit(GURL(kLandingURL));
305 {
jialiul792a6662016-12-03 01:44:10306 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38307 MakeUnsafeResource(kBadURL, true /* is_subresource */);
308 // Original resource url is whitelisted.
309 EXPECT_TRUE(IsWhitelisted(resource));
310 }
311 {
312 // A different malware subresource on the same page is also whitelisted.
313 // (The whitelist is by the page url, not the resource url.)
jialiul792a6662016-12-03 01:44:10314 security_interstitials::UnsafeResource resource2 =
mattmbfc4060d2015-12-18 23:11:38315 MakeUnsafeResource(kAnotherBadURL, true /* is_subresource */);
316 EXPECT_TRUE(IsWhitelisted(resource2));
317 }
318}
319
Evgenii Stepanov199c0132017-08-18 21:19:41320// Leaks memory. https://crbug.com/755118
321#if defined(LEAK_SANITIZER)
322#define MAYBE_UICallbackProceed DISABLED_UICallbackProceed
323#else
324#define MAYBE_UICallbackProceed UICallbackProceed
325#endif
326TEST_F(SafeBrowsingUIManagerTest, MAYBE_UICallbackProceed) {
jialiul792a6662016-12-03 01:44:10327 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38328 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41329 SafeBrowsingCallbackWaiter waiter;
330 resource.callback =
331 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
332 base::Unretained(&waiter));
333 resource.callback_thread =
Eric Seckler8652dcd52018-09-20 10:42:28334 base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::UI});
jialiul792a6662016-12-03 01:44:10335 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41336 resources.push_back(resource);
337 SimulateBlockingPageDone(resources, true);
338 EXPECT_TRUE(IsWhitelisted(resource));
339 waiter.WaitForCallback();
340 EXPECT_TRUE(waiter.callback_called());
341 EXPECT_TRUE(waiter.proceed());
342}
343
Evgenii Stepanov199c0132017-08-18 21:19:41344// Leaks memory. https://crbug.com/755118
345#if defined(LEAK_SANITIZER)
346#define MAYBE_UICallbackDontProceed DISABLED_UICallbackDontProceed
347#else
348#define MAYBE_UICallbackDontProceed UICallbackDontProceed
349#endif
350TEST_F(SafeBrowsingUIManagerTest, MAYBE_UICallbackDontProceed) {
jialiul792a6662016-12-03 01:44:10351 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38352 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41353 SafeBrowsingCallbackWaiter waiter;
354 resource.callback =
355 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDone,
356 base::Unretained(&waiter));
357 resource.callback_thread =
Eric Seckler8652dcd52018-09-20 10:42:28358 base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::UI});
jialiul792a6662016-12-03 01:44:10359 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41360 resources.push_back(resource);
361 SimulateBlockingPageDone(resources, false);
362 EXPECT_FALSE(IsWhitelisted(resource));
363 waiter.WaitForCallback();
364 EXPECT_TRUE(waiter.callback_called());
365 EXPECT_FALSE(waiter.proceed());
366}
367
Evgenii Stepanov199c0132017-08-18 21:19:41368// Leaks memory. https://crbug.com/755118
369#if defined(LEAK_SANITIZER)
370#define MAYBE_IOCallbackProceed DISABLED_IOCallbackProceed
371#else
372#define MAYBE_IOCallbackProceed IOCallbackProceed
373#endif
374TEST_F(SafeBrowsingUIManagerTest, MAYBE_IOCallbackProceed) {
jialiul792a6662016-12-03 01:44:10375 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38376 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41377 SafeBrowsingCallbackWaiter waiter;
378 resource.callback =
379 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
380 base::Unretained(&waiter));
381 resource.callback_thread =
Eric Seckler8652dcd52018-09-20 10:42:28382 base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10383 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41384 resources.push_back(resource);
385 SimulateBlockingPageDone(resources, true);
386 EXPECT_TRUE(IsWhitelisted(resource));
387 waiter.WaitForCallback();
388 EXPECT_TRUE(waiter.callback_called());
389 EXPECT_TRUE(waiter.proceed());
390}
391
Evgenii Stepanov199c0132017-08-18 21:19:41392// Leaks memory. https://crbug.com/755118
393#if defined(LEAK_SANITIZER)
394#define MAYBE_IOCallbackDontProceed DISABLED_IOCallbackDontProceed
395#else
396#define MAYBE_IOCallbackDontProceed IOCallbackDontProceed
397#endif
398TEST_F(SafeBrowsingUIManagerTest, MAYBE_IOCallbackDontProceed) {
jialiul792a6662016-12-03 01:44:10399 security_interstitials::UnsafeResource resource =
mattmbfc4060d2015-12-18 23:11:38400 MakeUnsafeResourceAndStartNavigation(kBadURL);
clamy4edbf0e2015-12-02 13:35:41401 SafeBrowsingCallbackWaiter waiter;
402 resource.callback =
403 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
404 base::Unretained(&waiter));
405 resource.callback_thread =
Eric Seckler8652dcd52018-09-20 10:42:28406 base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10407 std::vector<security_interstitials::UnsafeResource> resources;
clamy4edbf0e2015-12-02 13:35:41408 resources.push_back(resource);
409 SimulateBlockingPageDone(resources, false);
410 EXPECT_FALSE(IsWhitelisted(resource));
411 waiter.WaitForCallback();
412 EXPECT_TRUE(waiter.callback_called());
413 EXPECT_FALSE(waiter.proceed());
414}
415
dalecurtis6c58ed02016-10-28 23:02:37416namespace {
417
418// A WebContentsDelegate that records whether
419// VisibleSecurityStateChanged() was called.
420class SecurityStateWebContentsDelegate : public content::WebContentsDelegate {
421 public:
422 SecurityStateWebContentsDelegate() {}
423 ~SecurityStateWebContentsDelegate() override {}
424
425 bool visible_security_state_changed() const {
426 return visible_security_state_changed_;
427 }
428
429 void ClearVisibleSecurityStateChanged() {
430 visible_security_state_changed_ = false;
431 }
432
433 // WebContentsDelegate:
434 void VisibleSecurityStateChanged(content::WebContents* source) override {
435 visible_security_state_changed_ = true;
436 }
437
438 private:
439 bool visible_security_state_changed_ = false;
440 DISALLOW_COPY_AND_ASSIGN(SecurityStateWebContentsDelegate);
441};
442
443// A test blocking page that does not create windows.
444class TestSafeBrowsingBlockingPage : public SafeBrowsingBlockingPage {
445 public:
jialiul3d6032e2017-01-12 00:41:31446 TestSafeBrowsingBlockingPage(BaseUIManager* manager,
dalecurtis6c58ed02016-10-28 23:02:37447 content::WebContents* web_contents,
448 const GURL& main_frame_url,
449 const UnsafeResourceList& unsafe_resources)
jialiul3d6032e2017-01-12 00:41:31450 : SafeBrowsingBlockingPage(
451 manager,
452 web_contents,
453 main_frame_url,
454 unsafe_resources,
edwardjungd7395fb02017-05-12 23:13:29455 BaseSafeBrowsingErrorUI::SBErrorDisplayOptions(
ntfschra5448fa2017-02-02 01:01:31456 BaseBlockingPage::IsMainPageLoadBlocked(unsafe_resources),
Nate Fischer2820c5be2017-06-27 23:04:46457 false, // is_extended_reporting_opt_in_allowed
458 false, // is_off_the_record
459 false, // is_extended_reporting_enabled
Luke Zielinski47a92852018-03-01 20:42:57460 false, // is_extended_reporting_policy_managed
Nate Fischer2820c5be2017-06-27 23:04:46461 false, // is_proceed_anyway_disabled
462 true, // should_open_links_in_new_tab
Edward Jungc06541d2017-09-12 09:36:19463 true, // always_show_back_to_safety
ntfschre952a3e2017-05-19 19:15:30464 "cpn_safe_browsing")) { // help_center_article_link
dalecurtis6c58ed02016-10-28 23:02:37465 // Don't delay details at all for the unittest.
ntfschrfef42f92017-02-24 02:15:47466 SetThreatDetailsProceedDelayForTesting(0);
dalecurtis6c58ed02016-10-28 23:02:37467 DontCreateViewForTesting();
468 }
469};
470
471// A factory that creates TestSafeBrowsingBlockingPages.
472class TestSafeBrowsingBlockingPageFactory
473 : public SafeBrowsingBlockingPageFactory {
474 public:
475 TestSafeBrowsingBlockingPageFactory() {}
476 ~TestSafeBrowsingBlockingPageFactory() override {}
477
478 SafeBrowsingBlockingPage* CreateSafeBrowsingPage(
jialiul3d6032e2017-01-12 00:41:31479 BaseUIManager* delegate,
dalecurtis6c58ed02016-10-28 23:02:37480 content::WebContents* web_contents,
481 const GURL& main_frame_url,
482 const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
483 override {
484 return new TestSafeBrowsingBlockingPage(delegate, web_contents,
485 main_frame_url, unsafe_resources);
486 }
487};
488
489} // namespace
490
491// Tests that the WebContentsDelegate is notified of a visible security
492// state change when a blocking page is shown for a subresource.
Evgenii Stepanov199c0132017-08-18 21:19:41493// Leaks memory. https://crbug.com/755118
494#if defined(LEAK_SANITIZER)
495#define MAYBE_VisibleSecurityStateChangedForUnsafeSubresource \
496 DISABLED_VisibleSecurityStateChangedForUnsafeSubresource
497#else
498#define MAYBE_VisibleSecurityStateChangedForUnsafeSubresource \
499 VisibleSecurityStateChangedForUnsafeSubresource
500#endif
dalecurtis6c58ed02016-10-28 23:02:37501TEST_F(SafeBrowsingUIManagerTest,
Evgenii Stepanov199c0132017-08-18 21:19:41502 MAYBE_VisibleSecurityStateChangedForUnsafeSubresource) {
dalecurtis6c58ed02016-10-28 23:02:37503 TestSafeBrowsingBlockingPageFactory factory;
504 SafeBrowsingBlockingPage::RegisterFactory(&factory);
505 SecurityStateWebContentsDelegate delegate;
506 web_contents()->SetDelegate(&delegate);
507
508 // Simulate a blocking page showing for an unsafe subresource.
jialiul792a6662016-12-03 01:44:10509 security_interstitials::UnsafeResource resource =
dalecurtis6c58ed02016-10-28 23:02:37510 MakeUnsafeResource(kBadURL, true /* is_subresource */);
511 // Needed for showing the blocking page.
512 resource.threat_source = safe_browsing::ThreatSource::REMOTE;
513 NavigateAndCommit(GURL("http://example.test"));
514
515 delegate.ClearVisibleSecurityStateChanged();
516 EXPECT_FALSE(delegate.visible_security_state_changed());
517 ui_manager()->DisplayBlockingPage(resource);
518 EXPECT_TRUE(delegate.visible_security_state_changed());
519
520 // Simulate proceeding through the blocking page.
521 SafeBrowsingCallbackWaiter waiter;
522 resource.callback =
523 base::Bind(&SafeBrowsingCallbackWaiter::OnBlockingPageDoneOnIO,
524 base::Unretained(&waiter));
525 resource.callback_thread =
Eric Seckler8652dcd52018-09-20 10:42:28526 base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::IO});
jialiul792a6662016-12-03 01:44:10527 std::vector<security_interstitials::UnsafeResource> resources;
dalecurtis6c58ed02016-10-28 23:02:37528 resources.push_back(resource);
529
530 delegate.ClearVisibleSecurityStateChanged();
531 EXPECT_FALSE(delegate.visible_security_state_changed());
532 SimulateBlockingPageDone(resources, true);
533 EXPECT_TRUE(delegate.visible_security_state_changed());
534
535 waiter.WaitForCallback();
536 EXPECT_TRUE(waiter.callback_called());
537 EXPECT_TRUE(waiter.proceed());
538 EXPECT_TRUE(IsWhitelisted(resource));
539}
540
vakh9a474d832015-11-13 01:43:09541} // namespace safe_browsing