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(&params, 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(&params, 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