15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include <list>
6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/malware_details.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/ui_manager.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/web_contents_tester.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsTester;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kGoogleURL = "http://www.google.com/";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kGoodURL = "http://www.goodguys.com/";
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kBadURL = "http://www.badguys.com/";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kBadURL2 = "http://www.badguys2.com/";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kBadURL3 = "http://www.badguys3.com/";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A SafeBrowingBlockingPage class that does not create windows.
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class TestSafeBrowsingBlockingPage : public SafeBrowsingBlockingPage {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  TestSafeBrowsingBlockingPage(SafeBrowsingUIManager* manager,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 WebContents* web_contents,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const UnsafeResourceList& unsafe_resources)
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      : SafeBrowsingBlockingPage(manager, web_contents, unsafe_resources) {
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Don't delay details at all for the unittest.
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    malware_details_proceed_delay_ms_ = 0;
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DontCreateViewForTesting();
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestSafeBrowsingUIManager: public SafeBrowsingUIManager {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit TestSafeBrowsingUIManager(SafeBrowsingService* service)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SafeBrowsingUIManager(service) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SendSerializedMalwareDetails(
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& serialized) OVERRIDE {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    details_.push_back(serialized);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<std::string>* GetDetails() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &details_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestSafeBrowsingUIManager() {}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<std::string> details_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingBlockingPageFactory
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public SafeBrowsingBlockingPageFactory {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSafeBrowsingBlockingPageFactory() { }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestSafeBrowsingBlockingPageFactory() { }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SafeBrowsingBlockingPage* CreateSafeBrowsingPage(
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SafeBrowsingUIManager* manager,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebContents* web_contents,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OVERRIDE {
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return new TestSafeBrowsingBlockingPage(manager, web_contents,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              unsafe_resources);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingBlockingPageTest : public ChromeRenderViewHostTestHarness {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The decision the user made.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum UserResponse {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PENDING,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OK,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CANCEL
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SafeBrowsingBlockingPageTest() {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetUserResponse();
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The safe browsing UI manager does not need a service for this test.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_manager_ = new TestSafeBrowsingUIManager(NULL);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewHostTestHarness::SetUp();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SafeBrowsingBlockingPage::RegisterFactory(&factory_);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetUserResponse();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Release the UI manager before the BrowserThreads are destroyed.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_manager_ = NULL;
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SafeBrowsingBlockingPage::RegisterFactory(NULL);
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Clean up singleton reference (crbug.com/110594).
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    MalwareDetails::RegisterFactory(NULL);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewHostTestHarness::TearDown();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnBlockingPageComplete(bool proceed) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (proceed)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_response_ = OK;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_response_ = CANCEL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Navigate(const char* url, int page_id) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsTester::For(web_contents())->TestDidNavigate(
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        web_contents()->GetMainFrame(), page_id, GURL(url),
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ui::PAGE_TRANSITION_TYPED);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GoBack(bool is_cross_site) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry =
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents()->GetController().GetEntryAtOffset(-1);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(entry);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents()->GetController().GoBack();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The pending RVH should commit for cross-site navigations.
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content::RenderFrameHost* rfh = is_cross_site ?
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        WebContentsTester::For(web_contents())->GetPendingMainFrame() :
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        web_contents()->GetMainFrame();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsTester::For(web_contents())->TestDidNavigate(
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        rfh,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry->GetPageID(),
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL(entry->GetURL()),
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ui::PAGE_TRANSITION_TYPED);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowInterstitial(bool is_subresource, const char* url) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SafeBrowsingUIManager::UnsafeResource resource;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitResource(&resource, is_subresource, GURL(url));
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SafeBrowsingBlockingPage::ShowBlockingPage(ui_manager_.get(), resource);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the SafeBrowsingBlockingPage currently showing or NULL if none is
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // showing.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SafeBrowsingBlockingPage* GetSafeBrowsingBlockingPage() {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* interstitial =
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        InterstitialPage::GetInterstitialPage(web_contents());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!interstitial)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return  static_cast<SafeBrowsingBlockingPage*>(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        interstitial->GetDelegateForTesting());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserResponse user_response() const { return user_response_; }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetUserResponse() { user_response_ = PENDING; }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ProceedThroughInterstitial(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingBlockingPage* sb_interstitial) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sb_interstitial->interstitial_page_->Proceed();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Proceed() posts a task to update the SafeBrowsingService::Client.
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void DontProceedThroughInterstitial(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingBlockingPage* sb_interstitial) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sb_interstitial->interstitial_page_->DontProceed();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DontProceed() posts a task to update the SafeBrowsingService::Client.
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DontProceedThroughSubresourceInterstitial(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingBlockingPage* sb_interstitial) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CommandReceived(kTakeMeBackCommand) does a back navigation for
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // subresource interstitials.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoBack(false);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DontProceed() posts a task to update the SafeBrowsingService::Client.
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestSafeBrowsingUIManager> ui_manager_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InitResource(SafeBrowsingUIManager::UnsafeResource* resource,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool is_subresource,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const GURL& url) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->callback =
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&SafeBrowsingBlockingPageTest::OnBlockingPageComplete,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->url = url;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->is_subresource = is_subresource;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->threat_type = SB_THREAT_TYPE_URL_MALWARE;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->render_process_host_id =
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents()->GetRenderProcessHost()->GetID();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->render_view_id =
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents()->GetRenderViewHost()->GetRoutingID();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserResponse user_response_;
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  TestSafeBrowsingBlockingPageFactory factory_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a malware page and not proceeding.
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest, MalwarePageDontProceed) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware details.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  controller().LoadURL(GURL(kBadURL), content::Referrer(),
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ui::PAGE_TRANSITION_TYPED, std::string());
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(false, kBadURL);
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DontProceedThroughInterstitial(sb_interstitial);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone.
2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(CANCEL, user_response());
2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(GetSafeBrowsingBlockingPage());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, the pending entry should be gone.
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(controller().GetPendingEntry());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1u, ui_manager_->GetDetails()->size());
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a malware page and then proceeding.
2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest, MalwarePageProceed) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  controller().LoadURL(GURL(kBadURL), content::Referrer(),
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ui::PAGE_TRANSITION_TYPED, std::string());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(false, kBadURL);
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "proceed".
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProceedThroughInterstitial(sb_interstitial);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial is shown until the navigation commits.
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(InterstitialPage::GetInterstitialPage(web_contents()));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Commit the navigation.
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kBadURL, 1);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone now.
2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_FALSE(InterstitialPage::GetInterstitialPage(web_contents()));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1u, ui_manager_->GetDetails()->size());
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains malware subresources
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and not proceeding.
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest, PageWithMalwareResourceDontProceed) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoogleURL, 1);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere else.
2956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoodURL, 2);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
2986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DontProceedThroughSubresourceInterstitial(sb_interstitial);
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(CANCEL, user_response());
3076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(GetSafeBrowsingBlockingPage());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, we should be back to the first page, the 2nd one should
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have been removed from the navigation controller.
3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(1, controller().GetEntryCount());
3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(kGoogleURL, controller().GetActiveEntry()->GetURL().spec());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
3156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1u, ui_manager_->GetDetails()->size());
3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains malware subresources
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and proceeding.
3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest, PageWithMalwareResourceProceed) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
3246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
3296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoodURL, 1);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "proceed".
3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProceedThroughInterstitial(sb_interstitial);
3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(OK, user_response());
3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(GetSafeBrowsingBlockingPage());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did proceed, we should be back to showing the page.
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(1, controller().GetEntryCount());
3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(kGoodURL, controller().GetActiveEntry()->GetURL().spec());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1u, ui_manager_->GetDetails()->size());
3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains multiple malware
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresources and not proceeding.  This just tests that the extra malware
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresources (which trigger queued interstitial pages) do not break anything.
3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       PageWithMultipleMalwareResourceDontProceed) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoogleURL, 1);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere else.
3676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoodURL, 2);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // More bad resources loading causing more interstitials. The new
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interstitials should be queued.
3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL2);
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL3);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DontProceedThroughSubresourceInterstitial(sb_interstitial);
3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(CANCEL, user_response());
3846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(GetSafeBrowsingBlockingPage());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, we should be back to the first page, the 2nd one should
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have been removed from the navigation controller.
3886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(1, controller().GetEntryCount());
3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(kGoogleURL, controller().GetActiveEntry()->GetURL().spec());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
3926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1u, ui_manager_->GetDetails()->size());
3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains multiple malware
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresources and proceeding through the first interstitial, but not the next.
3986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       PageWithMultipleMalwareResourceProceedThenDontProceed) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
4026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
4076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoogleURL, 1);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere else.
4106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoodURL, 2);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
4136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // More bad resources loading causing more interstitials. The new
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interstitials should be queued.
4176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL2);
4186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL3);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
4216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed through the 1st interstitial.
4256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProceedThroughInterstitial(sb_interstitial);
4266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(OK, user_response());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
4296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1u, ui_manager_->GetDetails()->size());
4306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ResetUserResponse();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should land to a 2nd interstitial (aggregating all the malware resources
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded while the 1st interstitial was showing).
4366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  sb_interstitial = GetSafeBrowsingBlockingPage();
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't proceed through the 2nd interstitial.
4406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DontProceedThroughSubresourceInterstitial(sb_interstitial);
4416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(CANCEL, user_response());
4426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(GetSafeBrowsingBlockingPage());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, we should be back to the first page, the 2nd one should
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have been removed from the navigation controller.
4466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(1, controller().GetEntryCount());
4476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(kGoogleURL, controller().GetActiveEntry()->GetURL().spec());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No report should have been sent -- we don't create a report the
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // second time.
4516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(0u, ui_manager_->GetDetails()->size());
4526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains multiple malware
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresources and proceeding through the multiple interstitials.
4576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest,
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PageWithMultipleMalwareResourceProceed) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
4616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere else.
4666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoodURL, 1);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
4696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // More bad resources loading causing more interstitials. The new
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interstitials should be queued.
4736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL2);
4746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(true, kBadURL3);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
4776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed through the 1st interstitial.
4816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProceedThroughInterstitial(sb_interstitial);
4826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(OK, user_response());
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
4856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1u, ui_manager_->GetDetails()->size());
4866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ResetUserResponse();
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should land to a 2nd interstitial (aggregating all the malware resources
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded while the 1st interstitial was showing).
4926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  sb_interstitial = GetSafeBrowsingBlockingPage();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed through the 2nd interstitial.
4966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProceedThroughInterstitial(sb_interstitial);
4976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(OK, user_response());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did proceed, we should be back to the initial page.
5006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(1, controller().GetEntryCount());
5016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(kGoodURL, controller().GetActiveEntry()->GetURL().spec());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No report should have been sent -- we don't create a report the
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // second time.
5056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(0u, ui_manager_->GetDetails()->size());
5066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page then navigating back and forth to make sure the
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// controller entries are OK.  http://crbug.com/17627
5116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest, NavigatingBackAndForth) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
5146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
5196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kGoodURL, 1);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a bad page triggerring an interstitial.
5226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  controller().LoadURL(GURL(kBadURL), content::Referrer(),
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ui::PAGE_TRANSITION_TYPED, std::string());
5246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(false, kBadURL);
525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
5266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed, then navigate back.
5306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProceedThroughInterstitial(sb_interstitial);
5316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kBadURL, 2);  // Commit the navigation.
5326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  GoBack(true);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are back on the good page.
5356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  sb_interstitial = GetSafeBrowsingBlockingPage();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(sb_interstitial);
5376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(2, controller().GetEntryCount());
5386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(kGoodURL, controller().GetActiveEntry()->GetURL().spec());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate forward to the malware URL.
5416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  web_contents()->GetController().GoForward();
5426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(false, kBadURL);
5436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  sb_interstitial = GetSafeBrowsingBlockingPage();
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's proceed and make sure everything is OK (bug 17627).
5476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProceedThroughInterstitial(sb_interstitial);
5486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Navigate(kBadURL, 2);  // Commit the navigation.
5496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  sb_interstitial = GetSafeBrowsingBlockingPage();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(sb_interstitial);
5516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(2, controller().GetEntryCount());
5526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(kBadURL, controller().GetActiveEntry()->GetURL().spec());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Two reports should have been sent.
5556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(2u, ui_manager_->GetDetails()->size());
5566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that calling "don't proceed" after "proceed" has been called doesn't
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cause problems. http://crbug.com/30079
5616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest, ProceedThenDontProceed) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
5646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
5696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  controller().LoadURL(GURL(kBadURL), content::Referrer(),
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ui::PAGE_TRANSITION_TYPED, std::string());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
5736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(false, kBadURL);
574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
5756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "proceed" then "don't proceed" (before the
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interstitial is shown).
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sb_interstitial->interstitial_page_->Proceed();
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sb_interstitial->interstitial_page_->DontProceed();
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed() and DontProceed() post a task to update the
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SafeBrowsingService::Client.
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone.
5896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(OK, user_response());
5906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(GetSafeBrowsingBlockingPage());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only one report should have been sent.
5936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1u, ui_manager_->GetDetails()->size());
5946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a malware page with reports disabled.
5986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest, MalwareReportsDisabled) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable malware reports.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
6016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, false);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
6066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  controller().LoadURL(GURL(kBadURL), content::Referrer(),
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ui::PAGE_TRANSITION_TYPED, std::string());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
6106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(false, kBadURL);
611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
6126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
6186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DontProceedThroughInterstitial(sb_interstitial);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone.
6216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(CANCEL, user_response());
6226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(GetSafeBrowsingBlockingPage());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, the pending entry should be gone.
6256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(controller().GetPendingEntry());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No report should have been sent.
6286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(0u, ui_manager_->GetDetails()->size());
6296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_manager_->GetDetails()->clear();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Test that toggling the checkbox has the anticipated effects.
6336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SafeBrowsingBlockingPageTest, MalwareReportsToggling) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable malware reports.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
6366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_contents()->GetBrowserContext());
637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
638f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, false);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
6416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  controller().LoadURL(GURL(kBadURL), content::Referrer(),
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ui::PAGE_TRANSITION_TYPED, std::string());
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
6456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ShowInterstitial(false, kBadURL);
646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
6476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetSafeBrowsingBlockingPage();
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
653f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user check the report agreement checkbox.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sb_interstitial->SetReportingPreference(true);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile->GetPrefs()->GetBoolean(
659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user uncheck the report agreement checkbox.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sb_interstitial->SetReportingPreference(false);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
667