supervised_user_browsertest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/pref_service.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_constants.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_interstitial.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_navigation_observer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_settings_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/infobars/core/infobar.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests the filter mode in which all sites are blocked by default.
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SupervisedUserBlockModeTest : public InProcessBrowserTest {
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Indicates whether the interstitial should proceed or not.
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  enum InterstitialAction {
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    INTERSTITIAL_PROCEED,
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    INTERSTITIAL_DONTPROCEED,
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SupervisedUserBlockModeTest() : supervised_user_service_(NULL) {}
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~SupervisedUserBlockModeTest() {}
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CheckShownPageIsInterstitial(WebContents* tab) {
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CheckShownPage(tab, content::PAGE_TYPE_INTERSTITIAL);
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CheckShownPageIsNotInterstitial(WebContents* tab) {
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CheckShownPage(tab, content::PAGE_TYPE_NORMAL);
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Checks to see if the type of the current page is |page_type|.
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CheckShownPage(WebContents* tab, content::PageType page_type) {
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_FALSE(tab->IsCrashed());
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NavigationEntry* entry = tab->GetController().GetActiveEntry();
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_TRUE(entry);
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_EQ(page_type, entry->GetPageType());
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SendAccessRequest(WebContents* tab) {
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InterstitialPage* interstitial_page = tab->GetInterstitialPage();
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_TRUE(interstitial_page);
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Get the SupervisedUserInterstitial delegate.
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::InterstitialPageDelegate* delegate =
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        interstitial_page->GetDelegateForTesting();
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Simulate the click on the "request" button.
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate->CommandReceived("\"request\"");
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void GoBack(WebContents* tab) {
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InterstitialPage* interstitial_page = tab->GetInterstitialPage();
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_TRUE(interstitial_page);
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Get the SupervisedUserInterstitial delegate.
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::InterstitialPageDelegate* delegate =
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        interstitial_page->GetDelegateForTesting();
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Simulate the click on the "back" button.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->CommandReceived("\"back\"");
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Set up the SupervisedUserNavigationObserver manually since the profile
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // was not supervised when the browser was created.
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WebContents* web_contents =
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SupervisedUserNavigationObserver::CreateForWebContents(web_contents);
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Profile* profile = browser()->profile();
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    supervised_user_service_ =
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        SupervisedUserServiceFactory::GetForProfile(profile);
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SupervisedUserSettingsService* supervised_user_settings_service =
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        SupervisedUserSettingsServiceFactory::GetForProfile(profile);
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    supervised_user_settings_service->SetLocalSettingForTesting(
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        supervised_users::kContentPackDefaultFilteringBehavior,
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        scoped_ptr<base::Value>(
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            new base::FundamentalValue(SupervisedUserURLFilter::BLOCK)));
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Enable the test server and remap all URLs to it.
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string host_port = test_server()->host_port_pair().ToString();
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    command_line->AppendSwitchASCII(switches::kHostResolverRules,
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "MAP *.example.com " + host_port + "," +
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "MAP *.new-example.com " + host_port + "," +
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "MAP *.a.com " + host_port);
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    command_line->AppendSwitchASCII(switches::kSupervisedUserId, "asdf");
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Acts like a synchronous call to history's QueryHistory. Modified from
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // history_querying_unittest.cc.
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void QueryHistory(HistoryService* history_service,
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    const std::string& text_query,
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    const history::QueryOptions& options,
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    history::QueryResults* results) {
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::RunLoop run_loop;
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::CancelableTaskTracker history_task_tracker;
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    history_service->QueryHistory(
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::UTF8ToUTF16(text_query),
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        options,
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&SupervisedUserBlockModeTest::QueryHistoryComplete,
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   base::Unretained(this),
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   results,
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   &run_loop),
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        &history_task_tracker);
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    run_loop.Run();  // Will go until ...Complete calls Quit.
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void QueryHistoryComplete(history::QueryResults* new_results,
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            base::RunLoop* run_loop,
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            history::QueryResults* results) {
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    results->Swap(new_results);
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    run_loop->Quit();  // Will return out to QueryHistory.
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SupervisedUserService* supervised_user_service_;
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MockTabStripModelObserver : public TabStripModelObserver {
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit MockTabStripModelObserver(TabStripModel* tab_strip)
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : tab_strip_(tab_strip) {
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    tab_strip_->AddObserver(this);
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ~MockTabStripModelObserver() {
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    tab_strip_->RemoveObserver(this);
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MOCK_METHOD3(TabClosingAt, void(TabStripModel*, content::WebContents*, int));
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TabStripModel* tab_strip_;
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Navigates to a blocked URL.
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest,
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       SendAccessRequestOnBlockedURL) {
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL test_url("http://www.example.com/files/simple.html");
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), test_url);
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckShownPageIsInterstitial(tab);
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendAccessRequest(tab);
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // TODO(sergiu): Properly check that the access request was sent here.
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GoBack(tab);
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Make sure that the tab is still there.
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(tab, browser()->tab_strip_model()->GetActiveWebContents());
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckShownPageIsNotInterstitial(tab);
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Navigates to a blocked URL in a new tab. We expect the tab to be closed
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// automatically on pressing the "back" button on the interstitial.
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, OpenBlockedURLInNewTab) {
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TabStripModel* tab_strip = browser()->tab_strip_model();
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebContents* prev_tab = tab_strip->GetActiveWebContents();
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Open blocked URL in a new tab.
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL test_url("http://www.example.com/files/simple.html");
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser(), test_url, NEW_FOREGROUND_TAB,
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check that we got the interstitial.
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebContents* tab = tab_strip->GetActiveWebContents();
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckShownPageIsInterstitial(tab);
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // On pressing the "back" button, the new tab should be closed, and we should
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // get back to the previous active tab.
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockTabStripModelObserver observer(tab_strip);
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              TabClosingAt(tab_strip, tab, tab_strip->active_index()));
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GoBack(tab);
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(prev_tab, tab_strip->GetActiveWebContents());
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests whether a visit attempt adds a special history entry.
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest,
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       HistoryVisitRecorded) {
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL allowed_url("http://www.example.com/files/simple.html");
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set the host as allowed.
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dict->SetBooleanWithoutPathExpansion(allowed_url.host(), true);
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SupervisedUserSettingsService* supervised_user_settings_service =
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SupervisedUserSettingsServiceFactory::GetForProfile(
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          browser()->profile());
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  supervised_user_settings_service->SetLocalSettingForTesting(
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      supervised_users::kContentPackManualBehaviorHosts,
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      dict.PassAs<base::Value>());
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SupervisedUserService::MANUAL_ALLOW,
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      supervised_user_service_->GetManualBehaviorForHost(allowed_url.host()));
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), allowed_url);
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Navigate to it and check that we don't get an interstitial.
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckShownPageIsNotInterstitial(tab);
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Navigate to a blocked page and go back on the interstitial.
24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  GURL blocked_url("http://www.new-example.com/files/simple.html");
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), blocked_url);
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  tab = browser()->tab_strip_model()->GetActiveWebContents();
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckShownPageIsInterstitial(tab);
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GoBack(tab);
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check that we went back to the first URL and that the manual behaviors
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // have not changed.
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(allowed_url.spec(), tab->GetURL().spec());
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(SupervisedUserService::MANUAL_ALLOW,
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            supervised_user_service_->GetManualBehaviorForHost(
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                "www.example.com"));
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SupervisedUserService::MANUAL_NONE,
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      supervised_user_service_->GetManualBehaviorForHost(
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          "www.new-example.com"));
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Query the history entry.
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  HistoryService* history_service = HistoryServiceFactory::GetForProfile(
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser()->profile(), Profile::EXPLICIT_ACCESS);
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  history::QueryOptions options;
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  history::QueryResults results;
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QueryHistory(history_service, "", options, &results);
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check that the entries have the correct blocked_visit value.
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(2u, results.size());
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(blocked_url.spec(), results[0].url().spec());
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(results[0].blocked_visit());
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(allowed_url.spec(), results[1].url().spec());
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(results[1].blocked_visit());
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, Unblock) {
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL test_url("http://www.example.com/files/simple.html");
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), test_url);
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebContents* web_contents =
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckShownPageIsInterstitial(web_contents);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the host as allowed.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBooleanWithoutPathExpansion(test_url.host(), true);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SupervisedUserSettingsService* supervised_user_settings_service =
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SupervisedUserSettingsServiceFactory::GetForProfile(
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          browser()->profile());
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  supervised_user_settings_service->SetLocalSettingForTesting(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      supervised_users::kContentPackManualBehaviorHosts,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict.PassAs<base::Value>());
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SupervisedUserService::MANUAL_ALLOW,
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      supervised_user_service_->GetManualBehaviorForHost(test_url.host()));
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(test_url, web_contents->GetURL());
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)