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.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingBlockingPageV1 :  public SafeBrowsingBlockingPageV1 {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSafeBrowsingBlockingPageV1(SafeBrowsingUIManager* manager,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 WebContents* web_contents,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const UnsafeResourceList& unsafe_resources)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SafeBrowsingBlockingPageV1(manager, web_contents, unsafe_resources) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't delay details at all for the unittest.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    malware_details_proceed_delay_ms_ = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't create a view.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page()->DontCreateViewForTesting();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A SafeBrowingBlockingPage class that does not create windows.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingBlockingPageV2 :  public SafeBrowsingBlockingPageV2 {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSafeBrowsingBlockingPageV2(SafeBrowsingUIManager* manager,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 WebContents* web_contents,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const UnsafeResourceList& unsafe_resources)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SafeBrowsingBlockingPageV2(manager, web_contents, unsafe_resources) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't delay details at all for the unittest.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    malware_details_proceed_delay_ms_ = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't create a view.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page()->DontCreateViewForTesting();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// A SafeBrowingBlockingPage class that does not create windows.
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class TestSafeBrowsingBlockingPageV3 :  public SafeBrowsingBlockingPageV3 {
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TestSafeBrowsingBlockingPageV3(SafeBrowsingUIManager* manager,
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 WebContents* web_contents,
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 const UnsafeResourceList& unsafe_resources)
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : SafeBrowsingBlockingPageV3(manager, web_contents, unsafe_resources) {
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Don't delay details at all for the unittest.
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    malware_details_proceed_delay_ms_ = 0;
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Don't create a view.
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    interstitial_page()->DontCreateViewForTesting();
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestSafeBrowsingUIManager: public SafeBrowsingUIManager {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit TestSafeBrowsingUIManager(SafeBrowsingService* service)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SafeBrowsingUIManager(service) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SendSerializedMalwareDetails(
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& serialized) OVERRIDE {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    details_.push_back(serialized);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<std::string>* GetDetails() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &details_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestSafeBrowsingUIManager() {}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<std::string> details_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <class SBInterstitialPage>
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingBlockingPageFactory
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public SafeBrowsingBlockingPageFactory {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSafeBrowsingBlockingPageFactory() { }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestSafeBrowsingBlockingPageFactory() { }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SafeBrowsingBlockingPage* CreateSafeBrowsingPage(
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SafeBrowsingUIManager* manager,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebContents* web_contents,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OVERRIDE {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(mattm): remove this when SafeBrowsingBlockingPageV2 supports
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // multi-threat warnings.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unsafe_resources.size() == 1 &&
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (unsafe_resources[0].threat_type == SB_THREAT_TYPE_URL_MALWARE ||
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         unsafe_resources[0].threat_type == SB_THREAT_TYPE_URL_PHISHING)) {
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return new SBInterstitialPage(manager, web_contents, unsafe_resources);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new TestSafeBrowsingBlockingPageV1(manager, web_contents,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              unsafe_resources);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <class SBInterstitialPage>
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingBlockingPageTest : public ChromeRenderViewHostTestHarness {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The decision the user made.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum UserResponse {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PENDING,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OK,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CANCEL
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SafeBrowsingBlockingPageTest() {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetUserResponse();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The safe browsing UI manager does not need a service for this test.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_manager_ = new TestSafeBrowsingUIManager(NULL);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewHostTestHarness::SetUp();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SafeBrowsingBlockingPage::RegisterFactory(&factory_);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetUserResponse();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Release the UI manager before the BrowserThreads are destroyed.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_manager_ = NULL;
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SafeBrowsingBlockingPage::RegisterFactory(NULL);
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Clean up singleton reference (crbug.com/110594).
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    MalwareDetails::RegisterFactory(NULL);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewHostTestHarness::TearDown();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnBlockingPageComplete(bool proceed) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (proceed)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_response_ = OK;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_response_ = CANCEL;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Navigate(const char* url, int page_id) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsTester::For(web_contents())->TestDidNavigate(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents()->GetRenderViewHost(), page_id, GURL(url),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::PAGE_TRANSITION_TYPED);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GoBack(bool is_cross_site) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntry* entry =
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents()->GetController().GetEntryAtOffset(-1);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(entry);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents()->GetController().GoBack();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The pending RVH should commit for cross-site navigations.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RenderViewHost* rvh = is_cross_site ?
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WebContentsTester::For(web_contents())->GetPendingRenderViewHost() :
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents()->GetRenderViewHost();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsTester::For(web_contents())->TestDidNavigate(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rvh,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry->GetPageID(),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL(entry->GetURL()),
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::PAGE_TRANSITION_TYPED);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowInterstitial(bool is_subresource, const char* url) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SafeBrowsingUIManager::UnsafeResource resource;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitResource(&resource, is_subresource, GURL(url));
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SafeBrowsingBlockingPage::ShowBlockingPage(ui_manager_.get(), resource);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the SafeBrowsingBlockingPage currently showing or NULL if none is
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // showing.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SafeBrowsingBlockingPage* GetSafeBrowsingBlockingPage() {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InterstitialPage* interstitial =
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        InterstitialPage::GetInterstitialPage(web_contents());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!interstitial)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return  static_cast<SafeBrowsingBlockingPage*>(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        interstitial->GetDelegateForTesting());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserResponse user_response() const { return user_response_; }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetUserResponse() { user_response_ = PENDING; }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ProceedThroughInterstitial(
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingBlockingPage* sb_interstitial) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sb_interstitial->interstitial_page_->Proceed();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Proceed() posts a task to update the SafeBrowsingService::Client.
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void DontProceedThroughInterstitial(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingBlockingPage* sb_interstitial) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sb_interstitial->interstitial_page_->DontProceed();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DontProceed() posts a task to update the SafeBrowsingService::Client.
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DontProceedThroughSubresourceInterstitial(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingBlockingPage* sb_interstitial) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CommandReceived(kTakeMeBackCommand) does a back navigation for
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // subresource interstitials.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoBack(false);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DontProceed() posts a task to update the SafeBrowsingService::Client.
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<TestSafeBrowsingUIManager> ui_manager_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InitResource(SafeBrowsingUIManager::UnsafeResource* resource,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool is_subresource,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const GURL& url) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->callback =
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&SafeBrowsingBlockingPageTest::OnBlockingPageComplete,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->url = url;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->is_subresource = is_subresource;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->threat_type = SB_THREAT_TYPE_URL_MALWARE;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->render_process_host_id =
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents()->GetRenderProcessHost()->GetID();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource->render_view_id =
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents()->GetRenderViewHost()->GetRoutingID();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserResponse user_response_;
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TestSafeBrowsingBlockingPageFactory<SBInterstitialPage> factory_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef ::testing::Types<TestSafeBrowsingBlockingPageV2,
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    TestSafeBrowsingBlockingPageV3> InterstitialTestTypes;
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST_CASE(SafeBrowsingBlockingPageTest, InterstitialTestTypes);
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a malware page and not proceeding.
258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, MalwarePageDontProceed) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware details.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->controller().LoadURL(GURL(kBadURL), content::Referrer(),
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::PAGE_TRANSITION_TYPED, std::string());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->DontProceedThroughInterstitial(sb_interstitial);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone.
282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->CANCEL, this->user_response());
283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->GetSafeBrowsingBlockingPage());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, the pending entry should be gone.
286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->controller().GetPendingEntry());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, this->ui_manager_->GetDetails()->size());
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a malware page and then proceeding.
294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, MalwarePageProceed) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->controller().LoadURL(GURL(kBadURL), content::Referrer(),
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::PAGE_TRANSITION_TYPED, std::string());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "proceed".
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial is shown until the navigation commits.
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(InterstitialPage::GetInterstitialPage(this->web_contents()));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Commit the navigation.
317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kBadURL, 1);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone now.
319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(InterstitialPage::GetInterstitialPage(this->web_contents()));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, this->ui_manager_->GetDetails()->size());
323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains malware subresources
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and not proceeding.
328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, PageWithMalwareResourceDontProceed) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoogleURL, 1);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere else.
339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoodURL, 2);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->DontProceedThroughSubresourceInterstitial(sb_interstitial);
350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->CANCEL, this->user_response());
351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->GetSafeBrowsingBlockingPage());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, we should be back to the first page, the 2nd one should
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have been removed from the navigation controller.
355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1, this->controller().GetEntryCount());
356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kGoogleURL, this->controller().GetActiveEntry()->GetURL().spec());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, this->ui_manager_->GetDetails()->size());
360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains malware subresources
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and proceeding.
365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, PageWithMalwareResourceProceed) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoodURL, 1);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "proceed".
383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->OK, this->user_response());
385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->GetSafeBrowsingBlockingPage());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did proceed, we should be back to showing the page.
388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1, this->controller().GetEntryCount());
389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kGoodURL, this->controller().GetActiveEntry()->GetURL().spec());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, this->ui_manager_->GetDetails()->size());
393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->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 not proceeding.  This just tests that the extra malware
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresources (which trigger queued interstitial pages) do not break anything.
399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       PageWithMultipleMalwareResourceDontProceed) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoogleURL, 1);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere else.
411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoodURL, 2);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // More bad resources loading causing more interstitials. The new
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interstitials should be queued.
418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL2);
419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL3);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->DontProceedThroughSubresourceInterstitial(sb_interstitial);
427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->CANCEL, this->user_response());
428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->GetSafeBrowsingBlockingPage());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, we should be back to the first page, the 2nd one should
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have been removed from the navigation controller.
432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1, this->controller().GetEntryCount());
433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kGoogleURL, this->controller().GetActiveEntry()->GetURL().spec());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, this->ui_manager_->GetDetails()->size());
437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains multiple malware
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresources and proceeding through the first interstitial, but not the next.
442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       PageWithMultipleMalwareResourceProceedThenDontProceed) {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoogleURL, 1);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere else.
454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoodURL, 2);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // More bad resources loading causing more interstitials. The new
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interstitials should be queued.
461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL2);
462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL3);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed through the 1st interstitial.
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->OK, this->user_response());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, this->ui_manager_->GetDetails()->size());
474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ResetUserResponse();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should land to a 2nd interstitial (aggregating all the malware resources
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded while the 1st interstitial was showing).
480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sb_interstitial = this->GetSafeBrowsingBlockingPage();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't proceed through the 2nd interstitial.
484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->DontProceedThroughSubresourceInterstitial(sb_interstitial);
485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->CANCEL, this->user_response());
486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->GetSafeBrowsingBlockingPage());
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, we should be back to the first page, the 2nd one should
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have been removed from the navigation controller.
490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1, this->controller().GetEntryCount());
491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kGoogleURL, this->controller().GetActiveEntry()->GetURL().spec());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No report should have been sent -- we don't create a report the
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // second time.
495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, this->ui_manager_->GetDetails()->size());
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a page that contains multiple malware
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresources and proceeding through the multiple interstitials.
501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest,
502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PageWithMultipleMalwareResourceProceed) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere else.
510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoodURL, 1);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate that page loading a bad-resource triggering an interstitial.
513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // More bad resources loading causing more interstitials. The new
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interstitials should be queued.
517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL2);
518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(true, kBadURL3);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed through the 1st interstitial.
525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->OK, this->user_response());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A report should have been sent.
529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, this->ui_manager_->GetDetails()->size());
530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ResetUserResponse();
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should land to a 2nd interstitial (aggregating all the malware resources
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded while the 1st interstitial was showing).
536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sb_interstitial = this->GetSafeBrowsingBlockingPage();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed through the 2nd interstitial.
540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
541f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->OK, this->user_response());
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did proceed, we should be back to the initial page.
544f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1, this->controller().GetEntryCount());
545f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kGoodURL, this->controller().GetActiveEntry()->GetURL().spec());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No report should have been sent -- we don't create a report the
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // second time.
549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, this->ui_manager_->GetDetails()->size());
550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page then navigating back and forth to make sure the
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// controller entries are OK.  http://crbug.com/17627
555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, NavigatingBackAndForth) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate somewhere.
563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kGoodURL, 1);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a bad page triggerring an interstitial.
566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->controller().LoadURL(GURL(kBadURL), content::Referrer(),
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::PAGE_TRANSITION_TYPED, std::string());
568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed, then navigate back.
574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kBadURL, 2);  // Commit the navigation.
576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->GoBack(true);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are back on the good page.
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sb_interstitial = this->GetSafeBrowsingBlockingPage();
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(sb_interstitial);
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(2, this->controller().GetEntryCount());
582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kGoodURL, this->controller().GetActiveEntry()->GetURL().spec());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate forward to the malware URL.
585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->web_contents()->GetController().GoForward();
586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sb_interstitial = this->GetSafeBrowsingBlockingPage();
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's proceed and make sure everything is OK (bug 17627).
591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
592f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->Navigate(kBadURL, 2);  // Commit the navigation.
593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sb_interstitial = this->GetSafeBrowsingBlockingPage();
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(sb_interstitial);
595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(2, this->controller().GetEntryCount());
596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kBadURL, this->controller().GetActiveEntry()->GetURL().spec());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Two reports should have been sent.
599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2u, this->ui_manager_->GetDetails()->size());
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that calling "don't proceed" after "proceed" has been called doesn't
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cause problems. http://crbug.com/30079
605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, ProceedThenDontProceed) {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable malware reports.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, true);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->controller().LoadURL(GURL(kBadURL), content::Referrer(),
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::PAGE_TRANSITION_TYPED, std::string());
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "proceed" then "don't proceed" (before the
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interstitial is shown).
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sb_interstitial->interstitial_page_->Proceed();
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sb_interstitial->interstitial_page_->DontProceed();
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proceed() and DontProceed() post a task to update the
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SafeBrowsingService::Client.
630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone.
633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->OK, this->user_response());
634f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->GetSafeBrowsingBlockingPage());
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only one report should have been sent.
637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, this->ui_manager_->GetDetails()->size());
638f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a blocking page for a malware page with reports disabled.
642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, MalwareReportsDisabled) {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable malware reports.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, false);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
650f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->controller().LoadURL(GURL(kBadURL), content::Referrer(),
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::PAGE_TRANSITION_TYPED, std::string());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
662f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->DontProceedThroughInterstitial(sb_interstitial);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone.
665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(this->CANCEL, this->user_response());
666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->GetSafeBrowsingBlockingPage());
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, the pending entry should be gone.
669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(this->controller().GetPendingEntry());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No report should have been sent.
672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, this->ui_manager_->GetDetails()->size());
673f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ui_manager_->GetDetails()->clear();
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
676f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Test that toggling the checkbox has the anticipated effects.
677f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, MalwareReportsToggling) {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable malware reports.
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
680f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(
682f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled, false);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
685f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->controller().LoadURL(GURL(kBadURL), content::Referrer(),
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::PAGE_TRANSITION_TYPED, std::string());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
689f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user check the report agreement checkbox.
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sb_interstitial->SetReportingPreference(true);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile->GetPrefs()->GetBoolean(
703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user uncheck the report agreement checkbox.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sb_interstitial->SetReportingPreference(false);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Test that the transition from old to new preference works.
713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, MalwareReportsTransitionEnabled) {
714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The old pref is enabled.
715f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
716f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
717f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(prefs::kSafeBrowsingReportingEnabled, true);
718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Start a load.
720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->controller().LoadURL(GURL(kBadURL), content::Referrer(),
721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             content::PAGE_TRANSITION_TYPED, std::string());
722f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
727f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
728f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
729f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // At this point, nothing should have changed yet.
732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
733f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
734f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
735f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
736f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
737f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Since the user has proceeded without changing the checkbox, the new pref
738f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // has been updated.
739f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile->GetPrefs()->GetBoolean(
740f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
741f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
742f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
743f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Test that the transition from old to new preference still respects the
744f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// user's checkbox preferences.
745f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TYPED_TEST(SafeBrowsingBlockingPageTest, MalwareReportsTransitionDisabled) {
746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The old pref is enabled.
747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
748f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->web_contents()->GetBrowserContext());
749f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(prefs::kSafeBrowsingReportingEnabled, true);
750f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
751f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Start a load.
752f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->controller().LoadURL(GURL(kBadURL), content::Referrer(),
753f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             content::PAGE_TRANSITION_TYPED, std::string());
754f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
755f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Simulate the load causing a safe browsing interstitial to be shown.
756f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ShowInterstitial(false, kBadURL);
757f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SafeBrowsingBlockingPage* sb_interstitial =
758f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this->GetSafeBrowsingBlockingPage();
759f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(sb_interstitial);
760f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
761f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
762f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
763f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // At this point, nothing should have changed yet.
764f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
765f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
766f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
767f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Simulate the user uncheck the report agreement checkbox.
768f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sb_interstitial->SetReportingPreference(false);
769f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
770f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  this->ProceedThroughInterstitial(sb_interstitial);
771f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
772f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The new pref is turned off.
773f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
774f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingExtendedReportingEnabled));
775f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSafeBrowsingReportingEnabled));
777f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
778f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kSafeBrowsingDownloadFeedbackEnabled));
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
780