1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/prefs/pref_service.h" 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/safe_browsing/malware_details.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/pref_names.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/test_render_view_host.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_entry.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/test_tab_contents.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/view_messages.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* kGoogleURL = "http://www.google.com/"; 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* kGoodURL = "http://www.goodguys.com/"; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* kBadURL = "http://www.badguys.com/"; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* kBadURL2 = "http://www.badguys2.com/"; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* kBadURL3 = "http://www.badguys3.com/"; 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A SafeBrowingBlockingPage class that does not create windows. 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestSafeBrowsingBlockingPage : public SafeBrowsingBlockingPage { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestSafeBrowsingBlockingPage(SafeBrowsingService* service, 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents, 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const UnsafeResourceList& unsafe_resources) 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : SafeBrowsingBlockingPage(service, tab_contents, unsafe_resources) { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Overriden from InterstitialPage. Don't create a view. 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual TabContentsView* CreateTabContentsView() { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass TestSafeBrowsingService: public SafeBrowsingService { 3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual ~TestSafeBrowsingService() {} 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void SendSerializedMalwareDetails(const std::string& serialized) { 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen details_.push_back(serialized); 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::list<std::string>* GetDetails() { 4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return &details_; 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::list<std::string> details_; 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestSafeBrowsingBlockingPageFactory 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : public SafeBrowsingBlockingPageFactory { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestSafeBrowsingBlockingPageFactory() { } 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~TestSafeBrowsingBlockingPageFactory() { } 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual SafeBrowsingBlockingPage* CreateSafeBrowsingPage( 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingService* service, 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents, 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources) { 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new TestSafeBrowsingBlockingPage(service, tab_contents, 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unsafe_resources); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SafeBrowsingBlockingPageTest : public RenderViewHostTestHarness, 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public SafeBrowsingService::Client { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The decision the user made. 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum UserResponse { 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PENDING, 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OK, 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CANCEL 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPageTest() 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : ui_thread_(BrowserThread::UI, MessageLoop::current()), 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick io_thread_(BrowserThread::IO, MessageLoop::current()) { 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResetUserResponse(); 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_ = new TestSafeBrowsingService(); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUp() { 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHostTestHarness::SetUp(); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage::RegisterFactory(&factory_); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResetUserResponse(); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // SafeBrowsingService::Client implementation. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnUrlCheckResult(const GURL& url, 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingService::UrlCheckResult result) { 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnBlockingPageComplete(bool proceed) { 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (proceed) 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch user_response_ = OK; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch user_response_ = CANCEL; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Navigate(const char* url, int page_id) { 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ViewHostMsg_FrameNavigate_Params params; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitNavigateParams(¶ms, page_id, GURL(url), PageTransition::TYPED); 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents()->TestDidNavigate(contents()->render_view_host(), params); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void GoBackCrossSite() { 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationEntry* entry = contents()->controller().GetEntryAtOffset(-1); 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(entry); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->controller().GoBack(); 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The navigation should commit in the pending RVH. 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ViewHostMsg_FrameNavigate_Params params; 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitNavigateParams(¶ms, entry->page_id(), GURL(entry->url()), 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PageTransition::TYPED); 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents()->TestDidNavigate(contents()->pending_rvh(), params); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ShowInterstitial(ResourceType::Type resource_type, 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* url) { 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingService::UnsafeResource resource; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitResource(&resource, resource_type, GURL(url)); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage::ShowBlockingPage(service_, resource); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the SafeBrowsingBlockingPage currently showing or NULL if none is 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // showing. 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* GetSafeBrowsingBlockingPage() { 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InterstitialPage* interstitial = 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InterstitialPage::GetInterstitialPage(contents()); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!interstitial) 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return static_cast<SafeBrowsingBlockingPage*>(interstitial); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserResponse user_response() const { return user_response_; } 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ResetUserResponse() { user_response_ = PENDING; } 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ProceedThroughInterstitial( 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial) { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial->Proceed(); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Proceed() posts a task to update the SafeBrowsingService::Client. 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void DontProceedThroughInterstitial( 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial) { 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial->DontProceed(); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // DontProceed() posts a task to update the SafeBrowsingService::Client. 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<TestSafeBrowsingService> service_; 15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void InitResource(SafeBrowsingService::UnsafeResource* resource, 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResourceType::Type resource_type, 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url) { 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource->client = this; 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource->url = url; 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource->resource_type = resource_type; 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource->threat_type = SafeBrowsingService::URL_MALWARE; 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen resource->render_process_host_id = contents()->GetRenderProcessHost()->id(); 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen resource->render_view_id = contents()->render_view_host()->routing_id(); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserResponse user_response_; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestSafeBrowsingBlockingPageFactory factory_; 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread ui_thread_; 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread io_thread_; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests showing a blocking page for a malware page and not proceeding. 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, MalwarePageDontProceed) { 17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware details. 17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start a load. 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller().LoadURL(GURL(kBadURL), GURL(), PageTransition::TYPED); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the load causing a safe browsing interstitial to be shown. 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::MAIN_FRAME, kBadURL); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the user clicking "don't proceed". 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DontProceedThroughInterstitial(sb_interstitial); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The interstitial should be gone. 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(CANCEL, user_response()); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(GetSafeBrowsingBlockingPage()); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We did not proceed, the pending entry should be gone. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(controller().pending_entry()); 20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A report should have been sent. 20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(1u, service_->GetDetails()->size()); 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests showing a blocking page for a malware page and then proceeding. 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, MalwarePageProceed) { 20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware reports. 20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 21021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 21121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start a load. 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller().LoadURL(GURL(kBadURL), GURL(), PageTransition::TYPED); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the load causing a safe browsing interstitial to be shown. 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::MAIN_FRAME, kBadURL); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the user clicking "proceed". 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProceedThroughInterstitial(sb_interstitial); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The interstitial is shown until the navigation commits. 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(InterstitialPage::GetInterstitialPage(contents())); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Commit the navigation. 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kBadURL, 1); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The interstitial should be gone now. 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(InterstitialPage::GetInterstitialPage(contents())); 22921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A report should have been sent. 23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(1u, service_->GetDetails()->size()); 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests showing a blocking page for a page that contains malware subresources 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and not proceeding. 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, PageWithMalwareResourceDontProceed) { 23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware reports. 23921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere. 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoogleURL, 1); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere else. 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoodURL, 2); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate that page loading a bad-resource triggering an interstitial. 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the user clicking "don't proceed". 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DontProceedThroughInterstitial(sb_interstitial); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(CANCEL, user_response()); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(GetSafeBrowsingBlockingPage()); 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We did not proceed, we should be back to the first page, the 2nd one should 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // have been removed from the navigation controller. 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, controller().entry_count()); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kGoogleURL, controller().GetActiveEntry()->url().spec()); 26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A report should have been sent. 26521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(1u, service_->GetDetails()->size()); 26621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests showing a blocking page for a page that contains malware subresources 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and proceeding. 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, PageWithMalwareResourceProceed) { 27221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware reports. 27321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 27421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 27521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere. 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoodURL, 1); 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate that page loading a bad-resource triggering an interstitial. 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the user clicking "proceed". 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProceedThroughInterstitial(sb_interstitial); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, user_response()); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(GetSafeBrowsingBlockingPage()); 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We did proceed, we should be back to showing the page. 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, controller().entry_count()); 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kGoodURL, controller().GetActiveEntry()->url().spec()); 29321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 29421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A report should have been sent. 29521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(1u, service_->GetDetails()->size()); 29621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests showing a blocking page for a page that contains multiple malware 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// subresources and not proceeding. This just tests that the extra malware 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// subresources (which trigger queued interstitial pages) do not break anything. 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageWithMultipleMalwareResourceDontProceed) { 30421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware reports. 30521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 30621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 30721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere. 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoogleURL, 1); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere else. 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoodURL, 2); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate that page loading a bad-resource triggering an interstitial. 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // More bad resources loading causing more interstitials. The new 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // interstitials should be queued. 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL2); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL3); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the user clicking "don't proceed". 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DontProceedThroughInterstitial(sb_interstitial); 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(CANCEL, user_response()); 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(GetSafeBrowsingBlockingPage()); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We did not proceed, we should be back to the first page, the 2nd one should 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // have been removed from the navigation controller. 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, controller().entry_count()); 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kGoogleURL, controller().GetActiveEntry()->url().spec()); 33421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 33521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A report should have been sent. 33621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(1u, service_->GetDetails()->size()); 33721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests showing a blocking page for a page that contains multiple malware 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// subresources and proceeding through the first interstitial, but not the next. 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageWithMultipleMalwareResourceProceedThenDontProceed) { 34421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware reports. 34521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 34621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 34721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere. 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoogleURL, 1); 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere else. 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoodURL, 2); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate that page loading a bad-resource triggering an interstitial. 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL); 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // More bad resources loading causing more interstitials. The new 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // interstitials should be queued. 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL2); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL3); 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Proceed through the 1st interstitial. 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProceedThroughInterstitial(sb_interstitial); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, user_response()); 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A report should have been sent. 37021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(1u, service_->GetDetails()->size()); 37121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 37221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResetUserResponse(); 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We should land to a 2nd interstitial (aggregating all the malware resources 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // loaded while the 1st interstitial was showing). 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial = GetSafeBrowsingBlockingPage(); 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't proceed through the 2nd interstitial. 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DontProceedThroughInterstitial(sb_interstitial); 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(CANCEL, user_response()); 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(GetSafeBrowsingBlockingPage()); 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We did not proceed, we should be back to the first page, the 2nd one should 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // have been removed from the navigation controller. 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, controller().entry_count()); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kGoogleURL, controller().GetActiveEntry()->url().spec()); 38921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 39021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // No report should have been sent -- we don't create a report the 39121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // second time. 39221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0u, service_->GetDetails()->size()); 39321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests showing a blocking page for a page that contains multiple malware 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// subresources and proceeding through the multiple interstitials. 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, PageWithMultipleMalwareResourceProceed) { 39921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware reports. 40021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 40121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 40221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere else. 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoodURL, 1); 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate that page loading a bad-resource triggering an interstitial. 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // More bad resources loading causing more interstitials. The new 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // interstitials should be queued. 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL2); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::SUB_RESOURCE, kBadURL3); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Proceed through the 1st interstitial. 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProceedThroughInterstitial(sb_interstitial); 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, user_response()); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A report should have been sent. 42221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(1u, service_->GetDetails()->size()); 42321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 42421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResetUserResponse(); 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We should land to a 2nd interstitial (aggregating all the malware resources 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // loaded while the 1st interstitial was showing). 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial = GetSafeBrowsingBlockingPage(); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Proceed through the 2nd interstitial. 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProceedThroughInterstitial(sb_interstitial); 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, user_response()); 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We did proceed, we should be back to the initial page. 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, controller().entry_count()); 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kGoodURL, controller().GetActiveEntry()->url().spec()); 43921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 44021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // No report should have been sent -- we don't create a report the 44121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // second time. 44221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0u, service_->GetDetails()->size()); 44321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests showing a blocking page then navigating back and forth to make sure the 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// controller entries are OK. http://crbug.com/17627 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, NavigatingBackAndForth) { 44921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware reports. 45021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 45121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 45221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate somewhere. 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kGoodURL, 1); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now navigate to a bad page triggerring an interstitial. 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller().LoadURL(GURL(kBadURL), GURL(), PageTransition::TYPED); 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::MAIN_FRAME, kBadURL); 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Proceed, then navigate back. 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProceedThroughInterstitial(sb_interstitial); 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kBadURL, 2); // Commit the navigation. 465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GoBackCrossSite(); 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We are back on the good page. 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial = GetSafeBrowsingBlockingPage(); 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(sb_interstitial); 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(2, controller().entry_count()); 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kGoodURL, controller().GetActiveEntry()->url().spec()); 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate forward to the malware URL. 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->controller().GoForward(); 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::MAIN_FRAME, kBadURL); 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial = GetSafeBrowsingBlockingPage(); 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's proceed and make sure everything is OK (bug 17627). 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProceedThroughInterstitial(sb_interstitial); 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Navigate(kBadURL, 2); // Commit the navigation. 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial = GetSafeBrowsingBlockingPage(); 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(sb_interstitial); 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(2, controller().entry_count()); 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kBadURL, controller().GetActiveEntry()->url().spec()); 48621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 48721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Two reports should have been sent. 48821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(2u, service_->GetDetails()->size()); 48921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that calling "don't proceed" after "proceed" has been called doesn't 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// cause problems. http://crbug.com/30079 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SafeBrowsingBlockingPageTest, ProceedThenDontProceed) { 49521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Enable malware reports. 49621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 49721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, true); 49821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start a load. 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller().LoadURL(GURL(kBadURL), GURL(), PageTransition::TYPED); 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the load causing a safe browsing interstitial to be shown. 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowInterstitial(ResourceType::MAIN_FRAME, kBadURL); 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(sb_interstitial); 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the user clicking "proceed" then "don't proceed" (before the 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // interstitial is shown). 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial->Proceed(); 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sb_interstitial->DontProceed(); 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Proceed() and DontProceed() post a task to update the 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // SafeBrowsingService::Client. 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The interstitial should be gone. 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, user_response()); 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(GetSafeBrowsingBlockingPage()); 52021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 52121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Only one report should have been sent. 52221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(1u, service_->GetDetails()->size()); 52321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 52421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 52521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 52621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Tests showing a blocking page for a malware page with reports disabled. 52721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(SafeBrowsingBlockingPageTest, MalwareReportsDisabled) { 52821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Disable malware reports. 52921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 53021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kSafeBrowsingReportingEnabled, false); 53121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 53221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Start a load. 53321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen controller().LoadURL(GURL(kBadURL), GURL(), PageTransition::TYPED); 53421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 53521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Simulate the load causing a safe browsing interstitial to be shown. 53621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ShowInterstitial(ResourceType::MAIN_FRAME, kBadURL); 53721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 53821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(sb_interstitial); 53921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 54021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen MessageLoop::current()->RunAllPending(); 54121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 54221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Simulate the user clicking "don't proceed". 54321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DontProceedThroughInterstitial(sb_interstitial); 54421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 54521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The interstitial should be gone. 54621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(CANCEL, user_response()); 54721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_FALSE(GetSafeBrowsingBlockingPage()); 54821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 54921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // We did not proceed, the pending entry should be gone. 55021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_FALSE(controller().pending_entry()); 55121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 55221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // No report should have been sent. 55321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0u, service_->GetDetails()->size()); 55421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen service_->GetDetails()->clear(); 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 5563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Test setting the malware report preferance 5583f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenTEST_F(SafeBrowsingBlockingPageTest, MalwareReports) { 5593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Disable malware reports. 5603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen contents()->profile()->GetPrefs()->SetBoolean( 5613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen prefs::kSafeBrowsingReportingEnabled, false); 5623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Start a load. 5643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen controller().LoadURL(GURL(kBadURL), GURL(), PageTransition::TYPED); 5653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Simulate the load causing a safe browsing interstitial to be shown. 5673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen ShowInterstitial(ResourceType::MAIN_FRAME, kBadURL); 5683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen SafeBrowsingBlockingPage* sb_interstitial = GetSafeBrowsingBlockingPage(); 5693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen ASSERT_TRUE(sb_interstitial); 5703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen MessageLoop::current()->RunAllPending(); 5723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_FALSE(contents()->profile()->GetPrefs()->GetBoolean( 5743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen prefs::kSafeBrowsingReportingEnabled)); 5753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Simulate the user check the report agreement checkbox. 5773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen sb_interstitial->SetReportingPreference(true); 5783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_TRUE(contents()->profile()->GetPrefs()->GetBoolean( 5803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen prefs::kSafeBrowsingReportingEnabled)); 5813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Simulate the user uncheck the report agreement checkbox. 5833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen sb_interstitial->SetReportingPreference(false); 5843f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_FALSE(contents()->profile()->GetPrefs()->GetBoolean( 5863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen prefs::kSafeBrowsingReportingEnabled)); 5873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 588