12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/common/cancelable_request.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/confirm_infobar_delegate.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_mode_interstitial.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_mode_navigation_observer.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_constants.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_service.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_service_factory.h"
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_settings_service.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_settings_service_factory.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/interstitial_page.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::InterstitialPage;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::NavigationController;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::NavigationEntry;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests the filter mode in which all sites are blocked by default.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ManagedModeBlockModeTest : public InProcessBrowserTest {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicates whether the interstitial should proceed or not.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum InterstitialAction {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INTERSTITIAL_PROCEED,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INTERSTITIAL_DONTPROCEED,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ManagedModeBlockModeTest() : managed_user_service_(NULL) {}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ManagedModeBlockModeTest() {}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckShownPageIsInterstitial(WebContents* tab) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckShownPage(tab, content::PAGE_TYPE_INTERSTITIAL);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckShownPageIsNotInterstitial(WebContents* tab) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckShownPage(tab, content::PAGE_TYPE_NORMAL);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Checks to see if the type of the current page is |page_type|.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckShownPage(WebContents* tab, content::PageType page_type) {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(tab->IsCrashed());
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NavigationEntry* entry = tab->GetController().GetActiveEntry();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(entry);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(page_type, entry->GetPageType());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SendAccessRequest(WebContents* tab) {
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    InterstitialPage* interstitial_page = tab->GetInterstitialPage();
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(interstitial_page);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Get the ManagedModeInterstitial delegate.
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    content::InterstitialPageDelegate* delegate =
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        interstitial_page->GetDelegateForTesting();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Simulate the click on the "request" button.
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delegate->CommandReceived("\"request\"");
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void GoBack(WebContents* tab) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialPage* interstitial_page = tab->GetInterstitialPage();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(interstitial_page);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Get the ManagedModeInterstitial delegate.
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    content::InterstitialPageDelegate* delegate =
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        interstitial_page->GetDelegateForTesting();
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Simulate the click on the "back" button.
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delegate->CommandReceived("\"back\"");
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Set up the ManagedModeNavigationObserver manually since the profile was
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // not managed when the browser was created.
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* web_contents =
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ManagedModeNavigationObserver::CreateForWebContents(web_contents);
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile = browser()->profile();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    managed_user_service_ = ManagedUserServiceFactory::GetForProfile(profile);
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ManagedUserSettingsService* managed_user_settings_service =
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ManagedUserSettingsServiceFactory::GetForProfile(profile);
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    managed_user_settings_service->SetLocalSettingForTesting(
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        managed_users::kContentPackDefaultFilteringBehavior,
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        scoped_ptr<base::Value>(
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            new base::FundamentalValue(ManagedModeURLFilter::BLOCK)));
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Enable the test server and remap all URLs to it.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string host_port = test_server()->host_port_pair().ToString();
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    command_line->AppendSwitchASCII(switches::kHostResolverRules,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "MAP *.example.com " + host_port + "," +
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "MAP *.new-example.com " + host_port + "," +
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "MAP *.a.com " + host_port);
1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    command_line->AppendSwitchASCII(switches::kManagedUserId, "asdf");
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Acts like a synchronous call to history's QueryHistory. Modified from
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // history_querying_unittest.cc.
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void QueryHistory(HistoryService* history_service,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    const std::string& text_query,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    const history::QueryOptions& options,
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    history::QueryResults* results) {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CancelableRequestConsumer history_request_consumer;
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::RunLoop run_loop;
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    history_service->QueryHistory(
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        UTF8ToUTF16(text_query),
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        options,
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &history_request_consumer,
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&ManagedModeBlockModeTest::QueryHistoryComplete,
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(this),
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   results,
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   &run_loop));
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    run_loop.Run();  // Will go until ...Complete calls Quit.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void QueryHistoryComplete(history::QueryResults* new_results,
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            base::RunLoop* run_loop,
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            HistoryService::Handle /* handle */,
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            history::QueryResults* results) {
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    results->Swap(new_results);
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    run_loop->Quit();  // Will return out to QueryHistory.
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ManagedUserService* managed_user_service_;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Navigates to a blocked URL.
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ManagedModeBlockModeTest,
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       SendAccessRequestOnBlockedURL) {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL test_url("http://www.example.com/files/simple.html");
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), test_url);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckShownPageIsInterstitial(tab);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendAccessRequest(tab);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TODO(sergiu): Properly check that the access request was sent here.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GoBack(tab);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckShownPageIsNotInterstitial(tab);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests whether a visit attempt adds a special history entry.
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ManagedModeBlockModeTest,
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       HistoryVisitRecorded) {
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL allowed_url("http://www.example.com/files/simple.html");
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set the host as allowed.
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<DictionaryValue> dict(new DictionaryValue);
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  dict->SetBooleanWithoutPathExpansion(allowed_url.host(), true);
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ManagedUserSettingsService* managed_user_settings_service =
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ManagedUserSettingsServiceFactory::GetForProfile(
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          browser()->profile());
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  managed_user_settings_service->SetLocalSettingForTesting(
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      managed_users::kContentPackManualBehaviorHosts, dict.PassAs<Value>());
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ManagedUserService::MANUAL_ALLOW,
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      managed_user_service_->GetManualBehaviorForHost(allowed_url.host()));
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), allowed_url);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to it and check that we don't get an interstitial.
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckShownPageIsNotInterstitial(tab);
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to a blocked page and go back on the interstitial.
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL blocked_url("http://www.new-example.com/files/simple.html");
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), blocked_url);
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  tab = browser()->tab_strip_model()->GetActiveWebContents();
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckShownPageIsInterstitial(tab);
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GoBack(tab);
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Check that we went back to the first URL and that the manual behaviors
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // have not changed.
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(allowed_url.spec(), tab->GetURL().spec());
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ManagedUserService::MANUAL_ALLOW,
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            managed_user_service_->GetManualBehaviorForHost("www.example.com"));
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ManagedUserService::MANUAL_NONE,
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      managed_user_service_->GetManualBehaviorForHost("www.new-example.com"));
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Query the history entry.
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HistoryService* history_service = HistoryServiceFactory::GetForProfile(
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->profile(), Profile::EXPLICIT_ACCESS);
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::QueryOptions options;
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::QueryResults results;
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryHistory(history_service, "", options, &results);
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Check that the entries have the correct blocked_visit value.
228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(2u, results.size());
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(blocked_url.spec(), results[0].url().spec());
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(results[0].blocked_visit());
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(allowed_url.spec(), results[1].url().spec());
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(results[1].blocked_visit());
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ManagedModeBlockModeTest, Unblock) {
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GURL test_url("http://www.example.com/files/simple.html");
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), test_url);
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebContents* web_contents =
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CheckShownPageIsInterstitial(web_contents);
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::WindowedNotificationObserver observer(
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::NotificationService::AllSources());
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Set the host as allowed.
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<DictionaryValue> dict(new DictionaryValue);
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  dict->SetBooleanWithoutPathExpansion(test_url.host(), true);
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ManagedUserSettingsService* managed_user_settings_service =
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ManagedUserSettingsServiceFactory::GetForProfile(
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          browser()->profile());
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  managed_user_settings_service->SetLocalSettingForTesting(
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      managed_users::kContentPackManualBehaviorHosts, dict.PassAs<Value>());
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ManagedUserService::MANUAL_ALLOW,
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      managed_user_service_->GetManualBehaviorForHost(test_url.host()));
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  observer.Wait();
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_url, web_contents->GetURL());
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
265